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
                    Administrator

                      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
                        Administrator

                          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
                              Administrator

                                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
                                Administrator

                                  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
                                    Administrator

                                      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.