Updates – vom eigenen Webspace – installieren

Startseite Foren Deutsches LiveCode-Forum Updates – vom eigenen Webspace – installieren

Ansicht von 12 Antwort-Themen
  • Autor
    Beiträge
    • #21906
      Peter_M
      Teilnehmer

        Hallo Forum,
        nachdem mein LiveCode-Projekt jetzt grundsätzlich funktioniert, habe ich das Problem, dass meine Patienten, die im Schnitt alles andere als technikaffin sind, mit der Installation des Programms unter Android in der Regel überfordert sind. Die Erstinstallation übernehme ich daher häufig in der Praxis.
        Ich suche deswegen dringend eine Möglichkeit, wenigstens die Updates narrensicher, das heißt automatisch installieren zu können. Ich dachte zu diesem Zweck an einen Stack, der dem eigentlichen Programm vorgeschaltet ist und nur überprüft, ob ein Update vorhanden ist, dieses Update dann von meinem Webspace holt, selbstständig installiert und startet. Ist die Installation des Updates mit Livecode-Bordmitteln zu erledigen? Kann man das APK-File irgendwie ” launchen”/mit einem LiveCode-Skript installieren? Gibt es hierzu vielleicht schon eine “Lesson”? Bin für jede Anregung dankbar.

        Peter

      • #21914
        Axwald
        Teilnehmer

          Hallo,

          bei meinen Projekten mache ich das so:

          Ich habe einen einfachen Haupt-Stack mit 1 Card, der als eine Art Anwendungs-Menü fungiert. Von hier aus werden die einzelnen “Module” (= Arbeits-Stacks)gestartet. Dieser Haupt-Stack beinhaltet ansonsten nur die Kryptographie, und den Update-Mechanismus.
          Dieser Stack alleine wird in eine Standalone (pro Plattform) kompiliert. Er ist sehr einfach gehalten, da er sich möglichst nicht ändern soll – denn um den zu ersetzen, braucht’s ja eine volle Programm-Installation!

          Meine Programmdaten liegen auf einem FTP-Server, mit vielen Verzeichnissen & unterschiedlichen Accounts.

          Um zu verstehen, wie das funktioniert, beschreibe ich am Besten mal einen Programm-Start. Im PreOpenStack-Handler stelle ich (plattform-spezifisch) Fenstergröße, Vollbildmodus, Datenverzeichnis etc. ein. Dann kommt der OpenStack-Handler:

          1.) Ich lese eine User-spezifische Schlüsseldatei ein (die mitgeliefert wird) und entschlüssele sie. Diese enthält einen Array mit FTP-Zugangsdaten und Benutzer-Namen & -Typ (“Chef”, “Büro”, “Fahrer” …).

          2.) Mit o.a. Daten hole ich weitere Dateien vom FTP: “Preferences”, “Modulliste” und “Menü” (und entschlüssele sie ggf.).

          3.) Die “Preferences” wird eingelesen, da sind alle Programm-Einstellungen drin (inkl. ein weiterer FTP-Account, EMail-Account, ein weiterer Schlüssel, Datenbank-Accounts usw.). Das wird als Array in eine custom Property des Stacks gepackt, zwecks leichtem Zugriff.

          4.) Die “Menü”-Datei wird gelesen, und damit das Haupt-Menü des Haupt-Stacks erzeugt.

          5.) Die “Modulliste” wird gelesen, und jetzt wird es interessant – da stehen alle Dateien (Stacks u.ä.) drin, die ggf. upgedatet werden müssen! Format:
          – [Dateiname].[Ext] – “myStack.livecode”
          – [Version] – wenn nicht leer, dann “the cStackVersion of stack [Dateiname].[Ext]”
          – [CRC32] – CRC32-Prüfsumme
          – [Unterverzeichnis lokal] – wohin gespeichert wird
          – [Unterverzeichnis auf FTP] – von wo geladen wird
          – [Modus] – “stack” -> speichern; “use” -> start using …; …
          Pro Datei eine Zeile, tab-getrennt. Das wird jetzt abgearbeitet: Gibt es diese Datei, im richtigen Verzeichnis? Wenn ja, ist es die aktuelle Version? Wenn ja, hat sie die richtige Prüfsumme?
          Wenn Nein (irgendwo in der Kette), dann wird sie frisch heruntergeladen & lokal überschrieben.
          Und wenn der Modus “use” ist, wird sie mittels “start using” als Bibliothek in den Message-Pfad eingebunden.

          Das ist es eigentlich, ziemlich verkürzt (ich habe da mal alle Sicherheitsmechanismen ‘rausgelassen, und die Font-Behandlung, und die Möglichkeit, den Haupt-Stack mittels Back- oder Front-Skripten zu erweitern, und …).

          Für das plattform-unabhängige Updaten sind zwei Sachen wichtig:

          I. Das Datenverzeichnis, wohin das alles gespeichert wird – auf mobil ist das “specialFolderPath(“documents”)”, auf’m Desktop kommt es drauf an, wo das Programm dann liegt – im Programm-Verzeichnis des OS haben wir üblichweise keine Schreib-Rechte … Ich installiere nach [Benutzer]/[Dokumente], da habe ich keine Probleme, und kann dann “specialfolderpath(“resources”)” nehmen.

          II. Die CRC32-Methode hat den Vorteil, daß der Benutzer immer mit einem frischen Stack startet. Das geht bei mir, da ich NIE Daten im Stack ablege (ich lösche sogar aktiv bei “closeStackRequest”). Das muss ggf. berücksichtigt werden.

          Ich lasse das jetzt mal so stehen, es sollte Dir eine Idee geben. Sag Bescheid, wenn etwas unklar ist, dann können wir ins Detail gehen 😉

          Viel Spaß!

        • #21918
          Peter_M
          Teilnehmer

            Hallo Axwald,
            zunächst einmal tausend Dank für die detaillierten Infos zu meinem Problem, insbesondere auch für deine Zeit, die du dafür verwenden musstest. Im Prinzip entspricht deine Vorgehensweise genau meinen Vorstellungen. Das Löschen von Daten anlässlich eines Updates ist für meine Appnicht erforderlich, ebenso nicht die Aufgliederung in verschiedene Usergruppen. Du hast es geahnt, dass mir natürlich nicht alles klar ist. Ich habe deiner Beschreibung entnommen, dass nach der Erstinstallation des Hauptstacks (=APK) die eigentliche User-App als .livecode-Datei installations- und updatemäßig zum
            Einsatz kommt und nicht als Standalone. Ist folgende Codezeile
            im Hauptstack ausreichend zur Installation einer User-App / eines Updates, vorausgesetzt die Pfade stimmen???
            start using stack “UserApp.livecode”

            Viele Grüße
            Peter

          • #21921
            Axwald
            Teilnehmer

              Hallo Peter,

              ein Stack ist eigentlich nur eine Text-Datei, die Beschreibung der Fenster & Bedienelemente, und die Eigenschaften & Skripte beinhaltet. Wenn Du daraus eine Stand-Alone machst, wird der Livecode-Programmcode hinzugefügt, und es wird eine Binär-Datei daraus.

              Diese Stand-Alone kann dann auch andere Stacks ausführen. Und das mache ich mir zu nutze – ich nehme einen (relativ) einfachen Stack mit Steuerungsfunktionen, und kompiliere den. Dabei wird die Laufzeitumgebung (= Livecode-Programmcode) sowie notwendige LC-Bibliotheken hinzugefügt (revsecurity.dll, revdb.dll …), und das, was ich in den “Standalone Application Settings” unter “Copy Files” angegeben habe (hier meine initiale Key-Datei & die Fonts & Sounds).

              Das Ergebnis ist für Windows ein Ordner mit einer .exe, die direkt startbar ist. Für Android kommt eine .apk ‘raus, die installiert werden kann. Für iGadgets kompiliere ich nicht, da mich niemand dafür bezahlt – alle mir bekannten iUser sind Kinder meiner Kunden, und die wollen TicToc & WhatsApp, und keine kostspielige Produktiv-Software 😉

              Wenn diese StandAlone gestartet wird, holt sie sich die nötigen Arbeits-Stacks vom FTP (wenn sie nicht schon in der aktuellen Version lokal vorliegen), wie beschrieben. Diese Arbeits-Stacks sind ganz normale .rev- oder .livecode-Stacks.

              Falls es sich um eine Bibliothek handelt, füge ich sie mit:
              start using stack (gPathD & slash & myStackName)
              in den Message Path ein – jetzt stehen mir die Befehle und Funktionen darin für alle Stacks zur Verfügung.

              Die Arbeits-Stacks werden aus dem “Programm-Menü” (= der Haupt-Stack) aufgerufen, mit:
              go stack (pPathD & slash & myStackName) in new window
              (gPathD ist der Pfad zum betr. Verzeichnis, in einer globalen Variable, in myStackName steht der Name des Stacks)

              Klarer?

              Usergruppen verwende ich, um fallweise bestimmte Funktionen sperren zu können – z.B. können Vertreter Aufträge nur anlegen & speichern, aber nicht abschließen – das kann nur die Zentrale. Also ist der “Abschließen”-Button nur sichtbar, wenn die Gruppe “Zentrale” ist 🙂

              Und Löschen – ich habe Daten in den Stacks, die ich nicht ungesichert irgendwo rumliegen lassen möchte. Die Stacks speichern zwar nicht, aber sicher ist sicher.

              Viel Spaß!

            • #21925
              Peter_M
              Teilnehmer

                Hallo Axwald,
                Deine Antwort hat mir sehr geholfen. Mir ist dadurch alles sehr viel klarer geworden. Ich bin erst am Samstag wieder vor (Programmier-) Ort und kann erst dann beurteilen, ob ich alles richtig verstanden habe und erfolgreich umsetzen kann.
                Da ich alle Befehle direkt in meiner User-App integriert habe und keine zusätzliche Bibliothek dazuladen muss, benötige ich vereinfacht gesagt im Hauptstack dann nur folgenden Code, um meine User-App automatisch upzudaten:
                go Stack (Pfad +”/myUserStack.livecode”) in new window
                Der Code: start using…. wird primär von mir nicht benötigt!?
                Ist das richtig gedacht?
                Dieses Vorgehen würde mir genialerweise auch das bisher für die Veröffentlichung jedes Updates nötige Kompilieren ersparen…..

                Viele Grüße
                Peter

              • #21937
                Peter_M
                Teilnehmer

                  Hallo Axwald,

                  ich habe versucht, Deine Codezeile
                  “go stack (pPathD & slash & myStackName) in new window”
                  im LiveCode-Dictionary und bei Google zu recherchieren, bin aber nicht fündig geworden. Wo kann ich (bisher nur laienhafter Programmieranfänger) solch profunde und offenbar für professionelle Software unverzichtbare Informationen und Kenntnisse erlangen?

                  Gruß
                  Peter

                • #21938
                  Klaus Major
                  Administrator

                    Hallo Peter,

                    Du machst es Dir etwas schwer. 🙂
                    Zunächst kann man “in new window” weglassen, weil das die “Werkseinstellung” ist.
                    Ein Stack mit -> go stack xyz
                    öffnet sich immer in einem neuen Fester, es sei denn, man skriptet das dementsprechend!

                    Und nun zur Verdeutlichung ein kleines Beispiel:

                    ...
                    ## Wir haben nur hier Schreibrechte auf der mobilen Platform,
                    ## d.h. Du musst den Stack auch in dieses Verzeichnis herunterladen!
                    ## -> specialfolderpath("documents")
                    
                    ## Das wäre die etwas komplexere Syntax, die ich weiter unten einfach mal aufgedröselt habe:
                    ## go stack (specialfolderpath("documents") & "/name_deines_geladenen_stacks.livecode")
                    
                    put specialfolderpath("documents") into derPfad ## -> gPathD
                    
                    ## Nun öffnen wir einfach Deinen Stack in dem Ordner:
                    go stack (derPfad & "/name_deines_geladenen_stacks.livecode")
                    ...

                    Siehste? Keine Raketenwissenschaft. 🙂

                    Gruß

                    Klaus

                  • #21940
                    Peter_M
                    Teilnehmer

                      Hallo Klaus,
                      danke für deine Erläuterungen! Ich hatte mich nur gewundert, dass diese Syntax im Livecode-Dictionary nicht zu finden war. Meine Frage: habe ich, wenn ich mit einem kompilierten Stack (=APK)
                      einen weiteren Stack im livecode-Format starte, dasselbe Ergebnis, als würde ich diesen Stack kompilieren und dann starten. Läuft der aufrufende Stack dann im Hintergrund weiter oder muss man ihn schließen?

                      LG
                      Peter

                    • #21941
                      Klaus Major
                      Administrator

                        Hi Peter,

                        Ich hatte mich nur gewundert, dass diese Syntax im Livecode-Dictionary nicht zu finden war.

                        und welchen Teil genau hattest Du nicht verstanden?
                        Im Dictionary unter “go” steht das aber drin mit “… in new window”

                        Meine Frage: habe ich, wenn ich mit einem kompilierten Stack (=APK) einen weiteren Stack im livecode-Format starte, dasselbe Ergebnis, als würde ich diesen Stack kompilieren und dann starten.

                        Ja.

                        Läuft der aufrufende Stack dann im Hintergrund weiter oder muss man ihn schließen?

                        Es reicht, wenn Du einfach zum anderen Stack gehst (go stack…)

                        Ist Dir das Prinzip der “Splashscreen” Herangehensweise nun klar?
                        Also quasi nur einen Platzhalter als Runtinme erstellen?

                        Gruß

                        Klaus

                      • #21943
                        Klaus Major
                        Administrator

                          Du darfst mich auch gerne privat kontaktieren, falls Du Hilfe benötigst oder nicht weiterkommst!
                          -> klaus AT major-k.de

                        • #21952
                          Peter_M
                          Teilnehmer

                            Hallo Klaus,
                            vielen Dank für dein Angebot. Falls ich trotz eurer umfassenden Infos noch Umsetzungsprobleme haben sollte, komme ich gerne darauf zurück.
                            Um meine Nachfragen zu erhellen: ich bin derzeit noch im Urlaub und habe lediglich mein Android-Handy dabei, kann also derzeit nicht livecoden. Offensichtlich ist das (Android-Version des Livecode-Dictionary an dieser Stelle unvollständig!) auch der Grund dafür, dass ich den go stack – Befehl nicht finden kann…..

                            Viele Grüsse
                            Peter

                          • #21956
                            Axwald
                            Teilnehmer

                              Hehe,

                              das Dictionary der neueren LC-Versionen ist, hmmm, “gewöhnungsbedürftig” 😉
                              Die OnLine-Version davon ist hier.

                              Es gibt eine Alternative: TinyDictionary.

                              Ich selber suche meist im Browser:
                              Livecode [Suchbegriff]
                              bringt meist das passende Ergebnis. Ansonsten – Max’ Wiki ist oft ausführlicher als die eigentliche Dokumentation.

                              Erholsamen Urlaub!

                            • #21962
                              Peter_M
                              Teilnehmer

                                Hi Axwald,
                                vielen Dank für die Links. Das hilft mir sehr gut weiter. Ich habe immer in einer Version, die ich aus dem Google Play Store heruntergeladen habe, nachgelesen. Dort gab es lediglich eine Info über go … in widget 🙁

                                Gruß
                                Peter

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