Lokale HTML Dateien

Startseite Foren Deutsches LiveCode-Forum Lokale HTML Dateien

Ansicht von 17 Antwort-Themen
  • Autor
    Beiträge
    • #33020
      Tim K
      Teilnehmer

      Hallo zusammen,

      in meinem nächsten Projekt möchte ich HTML-Seiten, die in die Android-App integriert sind, anzeigen und zwischen LiveCode und den Seiten hin und her kommunizieren. Die Seiten sind in einem Ordner „html“, den ich über „Copy Files“ in den Standalone Application Settings hinzufüge. Das funktioniert.

      Für den Browser habe ich zwei Wege probiert:

      1. Browserwidget
      Ich füge ein Browserwidget hinzu und setze die URL per Skript:

      put ("file://" & specialFolderPath("engine") & "/html/index.html") into adresse
      set the URL of widget "Browser" to adresse

      Der Browser meldet „File not found“. Ich habe hier diverse Varianten ausprobiert.

      2. Browser per Skript

      mobileControlCreate "browser"
      put the result into sBrowserId
      
      mobileControlSet sBrowserId, "url", "file://" & specialFolderPath("engine") & "/html/index.html"

      Obwohl der Pfad gleich ist wie oben, werden die Seiten hier angezeigt. Muss der Pfad vom Widget aus irgendwie angepasst werden?

      Für die Kommunikation werden ja nun „javascriptHandlers“ benötigt. Diese könnte ich beim Widget in den Eigenschaften hinzufügen. Da aber die Seiten gar nicht gefunden werden, hilft das nicht.

      Wie kann ich denn dem Browser im zweiten Fall die javascriptHandler zuweisen?

      Ich habe es versucht, das mit

      revBrowserAddJavaScriptHandler sBrowserID, "meinHTMLButton"

      zu machen, aber diese Methode funktioniert laut Dictionary mal wieder nicht unter Android. Gibt es dafür Alternativen oder ggf. auch eine ganz andere Herangehensweise?

      Das Skript wird auch bei diesem Befehl abgebrochen, der Browser meldet dann bei Klick auf den HTML-Button „liveCode is undefined“.

      Mir wäre die Verwendung des Widgets lieber, zumal es wohl grundsätzlich unter Android funktionieren müsste, auch mit javascriptHandlers.

      Vielen Dank für jeden Tipp
      Tim

    • #33022
      Torsten
      Teilnehmer

      Ersetze specialFolderPath(„engine“) durch specialFolderPath(„documents„)

    • #33050
      Tim K
      Teilnehmer

      Hallo Torsten,

      vielen Dank für die Antwort. Ich habe das ausprobiert, leider funktioniert das auch nicht, weil „ERR_FILE_NOT_FOUND“. Es wird ja auch gesagt, dass Dateien, die über „Copy Files“ hinzugefügt werden, unter specialFolderPath(„resources“) landen (klappt auch nicht) und dass unter Android …(„resources“) und … („engine“) gleich sind.

      Hinzu kommt ja, dass der Pfad prinzipiell stimmen müsste, weil die Seiten mit dem selbst erzeugten Browser und specialFolderPath(„engine“) angezeigt werden. Nur eben, dass ich da die javascriptHandler nicht angefügt kriege.

      Schönen Gruß
      Tim

    • #33358
      Torsten
      Teilnehmer

      Ich vermte, dass es ein Bug ist, ich kriege es auf dem vorgeschriebenen Weg auch nicht hin. Im Mac-Standalone ist alles korrekt mit specialfolderpath(„resources“) und copy files im Standalone-Dialog.
      Auf Android sind die Dateien ebenfalls im richtigen Verzeichnis, aber das Browserwidget kriegt es nicht hin.

      Auf der Suche danach, ob es ein Bug ist, habe ich folgenden Bugreport gefunden, bei dem ein ähnliches Pproblem auf IOS auftritt: https://quality.livecode.com/show_bug.cgi?id=22816

      Dort steht auch die Idee für einen Workaround: man muss einfach die Dateien, die im Resource-Folder sind, inn den Tempory-Folder kopieren 🙂

      Bei meiner Testapp sieht der Code dann so aus:

      put url ("file:" &  specialfolderpath("resources") & "/html/index.html") into url ("file:" & specialfolderpath("temporary") & "/index.html")
      set the url of widget "Browser" to  ("file://" & specialfolderpath("temporary") & "/index.html")

      Und es geht 🙂

      Happy Coding
      Torsten

    • #33359
      Torsten
      Teilnehmer

      Es geht auch mit dem documents-Folder:

      put url ("file:" &  specialfolderpath("resources") & "/html/index.html") into url ("file:" & specialfolderpath("documents") & "/index.html")
      set the url of widget "Browser" to  ("file://" & specialfolderpath("documents") & "/index.html")

      Also…funktionierende Lösung:

      1. Lokale HTML-Dateien wie üblich per Resource-Folder einrichten und auf Gerät speichern.
      2. Beim Start der App alle Dateien im Resource-Folder in den Documents-Folder kopieren (und eventuelle Unter-Folder entsprechend erzeugen.
      3. Die URLs für den Browser auf die Documents-Folder umbennenen.

      So gehts dann sowohl auf dem Desktop zum Testen als auch auf dem Mobilgerät.

      Happy Coding
      Torsten

    • #33651
      Tim K
      Teilnehmer

      Hallo Torsten,

      vielen Dank für den Tipp.

      Mein Problem dabei ist: Ich produziere die HTML-Seiten mit einem Autorentool, so dass selbst eine simple Seite aus sehr vielen Dateien besteht und natürlich soll das ganze am Ende nicht nur aus einer einzelnen Seite bestehen.

      Daher hatte ich die Idee, die Dateien in einem Zip zusammenzufassen, dies über „Copy files“ hinzuzufügen und dann in den „documents“ Ordner zu entpacken…

      Schon mal wieder vorab: Unter Windows funktioniert es einwandfrei, unter Android scheitert es gleich am Anfang.

      on mouseUp
         put (specialFolderPath("resources") & "/inhalt7.zip") into tArchive
         put (specialFolderPath("documents") & "/inhalt/") into dasergebnis
         
         
         
         create folder dasergebnis
         
         revZipOpenArchive tArchive, "read"
         put the result into fld "zeilen"
         
         put revZipEnumerateItems(tArchive) into tItems
         
         repeat for each line zipzeile in tItems
            if the last char of zipzeile ="/" then
               create folder dasergebnis & zipzeile
            end if
         end repeat
         
         put return & "1. Schleife" after fld "zeilen"
         
         repeat for each line zipzeile in tItems
            if the last char of zipzeile <> "/" then
               revZipExtractItemToFile tArchive, zipzeile, dasergebnis & zipzeile
            end if
         end repeat
         
         put return & "2. Schleife" after fld "zeilen"
         
         
         revZipCloseArchive tArchive
         
         
         set the URL of widget "Browser" to ("file://" & dasergebnis & "index.html")
         set the visible of widget "Browser" to true
      end mouseUp

      Was bedeutet der Fehler: „ziperr,Can’t open file: Not a directory“?

      Der weitere Code funktioniert natürlich nicht, wenn die Datei nicht geöffnet werden kann, nur „Not a directory“ bzw. „Kein Verzeichnis“ verstehe ich nicht.
      Wird das ZIP nicht gefunden? Die Fehlermeldung müsste anders aussehen.
      Livecode meint, das sei kein Zip? – Wie kommt es darauf? Ich habe das ZIP einmal mit Windows erstellt, einmal mit 7zip, nur falls die Zip-technik unterschiedlich ist.

      … und reine Frustration:
      Es kann doch nicht so schwierig sein, eine HTML-Datei in einem Browser zu öffnen. Ich habe die App inzwischen ca. 250 Mal veröffentlicht und habe es bislang nicht geschafft, überhaupt etwas anzuzeigen. Ob die Seiten dann wie geplant funktionieren, ob man das irgendwie „schön“ machen kann, ob die Kommunikation zwischen Browser und App möglich ist, habe ich inzwischen aus der Projektbeschreibung gelöscht, nur „Irgendwas Anzeigen, was keine Fehlermeldung ist“ ist momentan das Ziel. Jetzt mögen manchen sagen: „Ja ok, aber die Idee eine HTML Seite im Browser anzuzeigen, ist wie bemannte Raumfahrt zum Pluto: In der Theorie leicht vorstellbar, in der Praxis dennoch absurd“, aber bislang dachte ich, das sei nichts besonderes.
      Ich habe in Livecode insgesamt nur zwei Projekte bearbeitet, dies ist das zweite.
      Für „One Code to rule them all.“ taucht mir „Unter Windows geht’s – unter Android nicht“ erheblich zu oft auf. Wenn der eine Ring so funktioniert hätte, wäre Sauron schnell vergessen gewesen:
      „Ah ok, einen Moment noch, ich muss den Ring erst auf „Rohan“ umprogrammieren… Mist, „Mensch“ not supported – „Pferd“ not found. Can’t open „Nazgul“ critical error.“

    • #33657
      Torsten
      Teilnehmer

      Hi Tim,

      ich denke, der Fehler liegt ganz vorne im create folder-Befehl. Da hast Du nämlich schon im Folder-Namen ein Slash „/“ am Ende, was nicht sein darf!

      So ist es richtig:
      put (specialFolderPath("documents") & "/inhalt") into dasergebnis

      Warum Windows das klaglos hinnimmt, ist mirakulös. Ändere den Namen am Anfang und in den entsprechenden späteren Zeilen (ebenso beim Erzeugen der Folder aus dem Archiv, da ist derselbe Fehler!) und schau, ob das immer noch passiert.

      Happy Coding
      Torsten

    • #33658
      Klaus Major
      Verwalter

      Hi Tim,

      ich muss raten, denke aber, daß das Öffnen einer ZIP Datei irgendwie ein WRITE generiert,
      was natürlich im -> RESOURCES Ordner verboten ist.

      Ich würde die ZIP Datei zunächst in -> DOCUMENTS kopieren und von dort extrahieren.
      Ist auf jeden Fall ein Versuch wert!

      Gruß

      Klaus

    • #33660
      Torsten
      Teilnehmer

      Das kann natürlich auch ein Grund sein, auf jeden Fall genauso machen, wie Klaus vorgeschlagen hat.

    • #33661
      Klaus Major
      Verwalter

      Schätze, es werden ein paar TEMP Dateien im selben Ordner wie das ZIP abgelegt, was auf dem Handy natürlich in die Hose geht. 🙂

    • #33663
      Torsten
      Teilnehmer

      Ok, habe es gerade nochmal selbst getestet, man kann tatsächlich (entgegen der Dokumentation) auch Folder mit einem Slash am Ende erzeugen, sowohl auf Mac als auch auf Android (zumindest in den external documents, wo man es von aussen sehen kann). Dann wird wahrscheinlich der Tip von Klaus zum Erfolg führen.

      Ist also kein Fehler von Livecode, sondern eine Spezialität der Android-Entwicklung 😉

    • #33678
      Tim K
      Teilnehmer

      Wirklich speziell ist, wie ich mich mit jedem Schritt vorwärts, weiter vom Ziel entferne, insb. wenn das Ziel zu Beginn in meiner Wahrnehmung nur einen Schritt entfernt war.

      Ich mache also:

      put URL ("file:" & specialFolderPath("engine") & "/inhalt7.zip") into URL ("file:" & specialfolderpath("documents") & "/inhalt7.zip")

      Die Datei kommt dann auch im entsprechenden Ordner an, ist aber zerstört.

      Beim Versuch die Datei zu öffnen,
      Windows: „Der Zip-komprimierte Ordner ist ungültig“
      Android: „ziperr,Not a zip archive“

      Speziell ist auch, dass ich es fast schon als Fortschritt empfinde, dass der Fehler in beiden Umgebungen auftritt und nicht nur unter Android…

    • #33684
      Klaus Major
      Verwalter

      BINFILE!
      Es handelt sich um binäre Dateien!

      ...
      put URL ("BINfile:" & specialFolderPath("resources") & "/inhalt7.zip") into URL ("BINfile:" & specialfolderpath("documents") & "/inhalt7.zip")
      ...
    • #33694
      Klaus Major
      Verwalter

      P.S.
      Gewöhn Dir an, specialfolderpath(„resources“) auch auf der mobilen Platform zu verwenden! Ja, auch wenn dort ENGINE und RESOURCES identisch sind.
      So brauchst Du später nicht zu verzweigen, wenn Deine App(s) auch auf dem Desktop laufen sollen. 🙂

    • #33800
      Tim K
      Teilnehmer

      Danke Klaus, mit binfile lässt sich die Datei kopieren.

      Bevor ich darüber nachdenke, wie ich Details optimiere, müsste ich klären, ob Livecode überhaupt ein geeignetes Werkzeug ist.

      Das grenzt hier schon an Paranoia: Seit heute morgen enthält revZipEnumerateItems nur noch die Zeilen für Dateien, nicht mehr die für Ordner, obwohl die Ordner ja im Zip noch drin sind und mein Code die Liste nur ausliest, nicht verändert. Am Zip habe ich nichts geändert, am Code auch nicht. Alles, was nicht in Ordnern ist, wird auch entpackt.

      Und ja, natürlich ist das lösbar, ich kann die Ordner auch aus den Dateizeilen ableiten oder auch ganz ohne die Liste erzeugen, die sind immer gleich. Aber ich muss halt wieder zunächst einen Schritt zurück und erst mal da was lösen. Das wäre auch alles ok, wenn halbwegs sicher wäre, dass es am Ende funktioniert, nur es spricht eigentlich wenig dafür und mit dem, was ich eigentlich machen möchte, habe ich nicht mal ansatzweise angefangen.

    • #33810
      Klaus Major
      Verwalter

      Wieviele Dateien sind in der ZIP Datei?
      Das sollte doch flott in einem Rutsch (repeat loop) rüberzukopieren sein!

    • #33920
      Tim K
      Teilnehmer

      Hallo Klaus, hallo Torsten,

      ein bekanntes deutsches Sprichwort sagt: Sollte, Sollte, Fahrradkette …

      Es sollte generell nicht so schwierig sein, etwas so simples zu machen, es sollten keine Schreibrechte nötig sein, um das ZIP im Lesemodus zu öffnen, es sollte eine Funktion geben, das ganze ZIP auf einmal zu entpacken, die Liste der Elemente sollte immer gleich sein, Dateien, die beim Entpacken im Documents-Ordner angelegt werden, sollten gespeichert werden, etc.

      Mit einer separat, unabhängig vom Entpacken, angelegten Ordnerstruktur (die übrigens gespeichert wird) funktioniert es nun.

      Vielen Dank für die Hilfe und die Geduld.
      Tim

    • #33934
      Torsten
      Teilnehmer

      Hallo Tim,

      erstmal herzlichen Glückwunsch zur erfolgreichen Problemlösung!

      Kannst Du deinen Lösungsweg hier dokumentieren, so dass andere Teilnehmer diese Lösung nachvollziehen können?

      Ein wesentlicher Vorteil eines guten Forums ist ja, dass man wirklich gute Lösungen für Probleme findet, die späteren Benutzer helfen.

      Beste Grüße
      Torsten

Ansicht von 17 Antwort-Themen
  • Du musst angemeldet sein, um auf dieses Thema antworten zu können.