Startseite › Foren › Deutsches LiveCode-Forum › Lokale HTML Dateien
- Dieses Thema hat 17 Antworten und 3 Teilnehmer, und wurde zuletzt aktualisiert vor 3 Jahren, 3 Monaten von Torsten.
-
AutorBeiträge
-
-
August 10, 2021 um 10:30 Uhr #33020
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 -
August 10, 2021 um 11:09 Uhr #33022
Ersetze specialFolderPath(„engine“) durch specialFolderPath(„documents„)
-
August 10, 2021 um 14:43 Uhr #33050
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 -
August 13, 2021 um 17:33 Uhr #33358
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 -
August 13, 2021 um 17:56 Uhr #33359
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:
- Lokale HTML-Dateien wie üblich per Resource-Folder einrichten und auf Gerät speichern.
- Beim Start der App alle Dateien im Resource-Folder in den Documents-Folder kopieren (und eventuelle Unter-Folder entsprechend erzeugen.
- 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 -
August 17, 2021 um 11:04 Uhr #33651
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.“ -
August 17, 2021 um 11:23 Uhr #33657
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 -
August 17, 2021 um 11:27 Uhr #33658
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
-
August 17, 2021 um 11:32 Uhr #33660
Das kann natürlich auch ein Grund sein, auf jeden Fall genauso machen, wie Klaus vorgeschlagen hat.
-
August 17, 2021 um 11:53 Uhr #33661
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. 🙂
-
August 17, 2021 um 11:59 Uhr #33663
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 😉
-
August 17, 2021 um 16:37 Uhr #33678
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…
-
August 17, 2021 um 16:55 Uhr #33684
BINFILE!
Es handelt sich um binäre Dateien!... put URL ("BINfile:" & specialFolderPath("resources") & "/inhalt7.zip") into URL ("BINfile:" & specialfolderpath("documents") & "/inhalt7.zip") ...
-
August 17, 2021 um 18:24 Uhr #33694
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. 🙂 -
August 18, 2021 um 10:52 Uhr #33800
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.
-
August 18, 2021 um 11:20 Uhr #33810
Wieviele Dateien sind in der ZIP Datei?
Das sollte doch flott in einem Rutsch (repeat loop) rüberzukopieren sein! -
August 19, 2021 um 10:55 Uhr #33920
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 -
August 19, 2021 um 12:15 Uhr #33934
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
-
-
AutorBeiträge
- Du musst angemeldet sein, um auf dieses Thema antworten zu können.