Footer-Nav mit Cookie erzwingen

Hallo,

ich bin dabei, eine App für mein Forum auf iOS-Geräten zu erstellen. Glücklicherweise gibt es ein Projekt namens PWABuilder, das ein fertiges XCode-Projekt bereitstellt, um eine Web-App in eine native App zu verpacken. Das hat auch mit meinem Discourse-Forum hervorragend funktioniert, jedoch fehlt eine Zurück-Taste oder ähnliches, was die Navigation erleichtern würde.

iOS-App, generiert mit PWABuilder (keine Navigations-Leiste unten):

Im iOS-PWA gibt es jedoch eine Fußleiste mit einer Zurück-Taste. Ich habe bisher noch keinen Weg gefunden, diese außerhalb der iOS-PWA anzuzeigen.

iOS-PWA mit Navigations-Leiste unten, die sich aber nicht erzwingen lässt (ich habe keine einfache Möglichkeit gefunden):

Meine Frage lautet nun: Könnte diese Fußleiste auch innerhalb einer WKWebView angezeigt werden? Ich habe zudem eine Idee, wie man das lösen könnte. Apps, die mit PWABuilder erstellt wurden, bieten die Möglichkeit, beim Einsatz ein Cookie zu setzen. Wie wäre es damit: Die Navigations-Leiste wird immer dann angezeigt, wenn der Benutzer ein Cookie wie „mobile_footer_nav" besitzt? Dann wäre das Problem gelöst.

Einstellungen, die in einer mit PWABuilder erstellten App vorgenommen werden können (Cookie bei App-Nutzung):

Ich wäre sehr dankbar, wenn das Entwicklungsteam sich das einmal ansehen könnte.

(Ich weiß, dass es die DiscourseHub-App gibt, aber eine separate App für ein Forum ist die elegantere Lösung und für den Benutzer einfacher zu bedienen und zu verstehen.)

1 „Gefällt mir“

Discourse rendert diesen Footer basierend auf bestimmten Bedingungen. Der Footer wird hier hinzugefügt.

discourse/app/assets/javascripts/discourse/app/templates/application.hbs at a0bbc346cb5d5b89d1a3efdfa89869349a8b067f · discourse/discourse · GitHub

showFooterNav ist hier definiert.

discourse/app/assets/javascripts/discourse/app/controllers/application.js at 1472e47aae5bfdfb6fd9abfe89beb186c751f514 · discourse/discourse · GitHub

Wenn einer dieser Werte wahr ist, wird die Navigation angezeigt.

isiOSPWA() und isAppWebview() sind hier definiert:

discourse/app/assets/javascripts/discourse/app/lib/utilities.js at 1472e47aae5bfdfb6fd9abfe89beb186c751f514 · discourse/discourse · GitHub

Zum Beispiel sieht isAppWebview() so aus:

discourse/app/assets/javascripts/discourse/app/lib/utilities.js at 1472e47aae5bfdfb6fd9abfe89beb186c751f514 · discourse/discourse · GitHub

Sie können in Ihrem Theme – auf Ihrer Discourse-Website – eine zusätzliche Bedingung erstellen, um nach dem Cookie zu suchen, wie folgt:

const isWKWebView = () => {
  // nach dem Cookie suchen und true zurückgeben, falls vorhanden
  // oder eine andere Methode verwenden, um zu erkennen, ob der Benutzer Ihre Anwendung nutzt
}

Für andere Klassen könnten Sie normalerweise die showFooterNav()-Methode wie folgt ändern:

api.modifyClass("controller:application", {
  pluginId: "show-footer-nav",
  @discourseComputed
  showFooterNav() {
    // ...
  }
});

Dies ist jedoch der Application-Controller, was bedeutet, dass er zwischengespeichert wird, bevor Ihr Code ausgeführt werden kann. Mit anderen Worten: Sie können die Klasse nicht ändern.

Trotzdem können Sie den Wert von showFooterNav mit etwas wie folgendem ändern:

<script type="text/discourse-plugin" version="0.8">
  const isWKWebView = () => {
    // prüfen und Ihre Bedingung zurückgeben
  };

  if (isWKWebView()) {
    const applicationController = api.container.lookup("controller:application");
    applicationController.set("showFooterNav", true);
  }
</script>

entweder im Reiter „Header" Ihres Themes oder in einem Initialisierer, wenn Sie ein Remote-Theme verwenden.

5 „Gefällt mir“

Vielen Dank für die schnelle Hilfe. Leider erhalte ich einen Fehler.

Ich habe diese Codezeilen im Header des Themas eingefügt und in isWKWebView() auch die Möglichkeit zum Prüfen von Cookies hinzugefügt. Wenn ich kein Cookie habe, passiert nichts. Das funktioniert vorerst. Wenn ich jedoch ein Cookie habe, wird diese Leiste leider nicht angezeigt, und in der Konsole erscheint ein Fehler: „TypeError: Attempted to assign to readonly property."

1 „Gefällt mir“

Ich habe das nur lokal ausprobiert, vielleicht liegt es daran.

Versuche stattdessen folgendes:

applicationController.set("showFooterNav", true);

anstatt

applicationController.showFooterNav = true;

Ich werde den Beitrag mit dieser Änderung bearbeiten.

2 „Gefällt mir“

Es funktioniert einwandfrei! Vielen Dank :slight_smile:

Mein abschließender Code:

<script type="text/discourse-plugin" version="0.8">
function getCookie(cname) {
  let name = cname + "=";
  let decodedCookie = decodeURIComponent(document.cookie);
  let ca = decodedCookie.split(';');
  for(let i = 0; i < ca.length; i++) {
    let c = ca[i];
    while (c.charAt(0) == ' ') {
      c = c.substring(1);
    }
    if (c.indexOf(name) == 0) {
      return c.substring(name.length, c.length);
    }
  }
  return "";
}

if (getCookie("app-platform") != "") {
    const applicationController = api.container.lookup("controller:application");
    applicationController.set("showFooterNav", true);
}
</script>
2 „Gefällt mir“