2014-11-17 18 views
13

Wir verwenden Cordova zusammen mit AngularJS für iOS und Android-Anwendungen.Cordova/Phonegap: Live Update Codebase

Ein großer Nachteil von iOS sind die langen Überprüfungszeiten von Apple. Im Google Playstore ist Ihre App fast sofort oder innerhalb weniger Stunden verfügbar. Aber Apple braucht ewig, um Ihre App zu überprüfen, auch wenn es nur eine kleine Änderung ist.

Also dachte ich, wenn es eine Möglichkeit gibt, eine Art Live-Update zu unterstützen.
Das bedeutet, ich könnte eine ZIP-Datei oder etwas anderes mit einer neuen Codebasis bereitstellen, meine App sucht nach Updates und installiert dann die neuen Dateien.

Ich habe etwas aus appmobi gelesen, aber gibt es irgendwelche Open-Source-Lösungen?

+0

Sie sollten sich wahrscheinlich ein oder zwei Minuten Zeit nehmen, um die Lizenzvereinbarung für Ihr iOS-Entwicklerprogramm zu lesen. Was Sie vorschlagen, ist keine neue Idee, aber es passiert nicht, weil es eine Verletzung Ihrer Vereinbarung mit Apple ist. – sherb

+1

Aber ich kenne einige Spiele, die regelmäßig Updates abrufen. Verstoßen sie auch gegen das Abkommen? – 23tux

+0

* Inhalt * Updates sind zulässig, ausführbarer Code jedoch nicht. Es gibt einen Unterschied zwischen Code und Inhalt, der in manchen Fällen unscharf ist. Ich bin kein Anwalt, aber als Mitentwickler rate ich nur zur Vorsicht. Viel Glück! – sherb

Antwort

4

Ich kenne keine fertigen Lösungen dafür, aber es sollte einfach genug sein, so etwas auf eigene Faust zu programmieren. Hier einige Punkte sind Sie beginnen und zu berücksichtigen:

  • Wenn Sie Updates über zip verteilen möchten, müssen Sie ein Nativ-Plugin, das die Extraktion
  • Sie Griffe könnten nicht in der Lage sein, Dateien in das außer Kraft setzen Standardspeicherort Ihrer App (abhängig vom Betriebssystem) Daher müssen alle Dateien, die Sie in Zukunft aktualisieren möchten, in einem Ordner liegen, auf den Ihre App Lese-/Schreibzugriff hat (iOS: zB Bibliothek oder Dokumente).
  • Jetzt müssen Sie nur noch das Zip-Paket herunterladen, entpacken Zip zu Ihrem gewählten Verzeichnis und starten/laden Sie Ihre App neu.
  • Sie können native Plugins nicht aktualisieren!
  • von Apple wahrscheinlich nicht so mag, da Sie in der Lage sind, ohne die gesamte Anwendung zu ändern bestandenen Prüfungsprozess
+0

Ja, das ist so, wie ich es auch selbst implementieren würde. Leider scheint es noch keine Open-Source-Lösungen zu geben. – 23tux

+1

Eigentlich ist alles in Ordnung mit Apple: https://www.meteor.com/blog/2014/10/02/Apple-hot-code-push-mobile Solange Sie nicht "den primären Zweck der Anwendung ändern ". – Rick

1

Nun, Adobe bietet genau diesen Dienst in ihrer Phonegap Build Service. Es heißt Hydration.

Das Beispiel zeigt die Verwendung mit Android- und iOS-Plattformen, daher denke ich, dass sie mit dem iOS-Lizenzvertrag für Entwickler kompatibel sind.

Wenn Sie Cordova verwenden, müssen Sie wahrscheinlich zum Phonegap CLI wechseln, wenn Sie ihre Build-Cloud-Dienste verwenden möchten, die im Grunde die gleichen wie Cordova mit einigen zusätzlichen Befehlen zum Hochladen in ihre Cloud usw.

sind

Ich denke, es gibt einige plugin wie Splashscreen, die auch einige kleinere Änderungen haben (mit <gap> für params in config.xml statt <preference>). Auch wenn Hydration das Problem für Sie löst, sind die Änderungen geringfügig und Sie erhalten ein wirklich nettes Feature.

+0

Cool, ich wusste nicht, dass sie so einen Service bieten. Aber so cool wie es ist, würde ich eine Open-Source-Lösung bevorzugen (die noch nicht hier ist;)) – 23tux

+2

yeah ... Also, wenn Sie endlich selbst eine Lösung implementieren ... stellen Sie sicher, Open-Source es; -) – jrub

0

Ich denke, es gibt keine solche Lösung ist verfügbar, aber Sie können es auf programmatische Weise tun.Sie können Ihre Cardova-App aktualisieren, indem Sie Dateien vom Server abrufen und aktualisieren.

2

Ich mache das in meiner Cordova App und hatte keine Probleme mit der IOS App Store Review.

Ich benutze Jquery's Ajax-Funktion, um sowohl eine Javascript- als auch eine CSS-Datei von einem Server herunterzuladen, die ich ohne App-Store-Genehmigung ändern kann und dann kann ich diese Skripte injizieren, sobald sie beim App-Start heruntergeladen wurden.

Ich habe versucht, die Cordova File API zu verwenden, und ich würde dann die Datei lokal speichern, aber Offline-Unterstützung ist nicht wichtig für mich im Moment und Jquery Ajax ist viel einfacher.

Hier ist der Jquery-Code, den ich verwende. Ich habe eine Bundle-ID, mit der ich feststellen kann, ob eine neue Javascript-Datei verfügbar ist, ansonsten speichert Jquery's Ajax die vorherigen Anfragen, um die Download-Zeit zu beschleunigen.

Mit dieser Lösung können Sie eine Teilmenge Ihres Codes dynamisch gestalten. Ich habe immer noch einen Basissatz von Code, der mit der App gebündelt ist, zusammen mit nativem Plugin js und nativem Code, der durch den App Store gehen müsste. Aber das lässt mich Bugfixes pushen, ohne den App Store zu durchlaufen.

Ansonsten würde ich auf eine Lösung wie folgt aussehen: http://docs.build.phonegap.com/en_US/tools_hydration.md.html

function insertScript(version) { 
    var scriptUrl = ""; 
    try { 
     // get javascript file... 
     scriptUrl = mobileWebServiceUrl + "/DynamicContent/Bundles/Scripts/dynamic"; 

     scriptUrl += "_" + bundleVersion.replace(/\./g, "_") + ".js?v=" + version; 

     console.log("downloading script: " + scriptUrl); 

     // Allow user to set any option except for dataType, cache, and url 
     options = { 
      dataType: "script", 
      cache: true, 
      url: scriptUrl 
     }; 

     // Use $.ajax() since it is more flexible than $.getScript 
     // Return the jqXHR object so we can chain callbacks 
     return $.ajax(options).success(function(response) { 
      console.log("insertScript success"); 
      dynamicContentScriptLoaded = true; 
     }); 


    } catch (e) { 
     //console.error(e); 
     ReportError("problem downloading javscript: " + scriptUrl); 
    } 

} 


function insertCSS(version) { 
    try { 
     // get css file... 
     var cssUrl = mobileWebServiceUrl + "/DynamicContent/Bundles/Css/dynamic"; 

     cssUrl += "_" + bundleVersion.replace(/\./g, "_") + ".css?v=" + version; 

     console.log("downloading dynamic css: " + cssUrl); 

     $.ajax(cssUrl) 
      .success(function (response) { 
       console.log("successfully downloaded dynamic css"); 
       var script = document.createElement("style"); 
       script.type = "text/css"; 
       script.innerHTML = response; 

       $('head link').each(function() { 
        if ($(this).attr('href').search('MobileFrame') > -1) { 
         $("#MobileFrameCSS").before(script); 
        } 
       }); 

       dynamicContentCssLoaded = true; 

       // TODO: implement caching at a later date 
       //if (isPhoneGap()) 
       // saveFile("DynamicStyles", response); 

      }); 
    } catch (e) { 
     ReportError("problem downloading css"); 
    } 

} 
+0

Falls Sie Ihr CSS aktualisieren, wie gehen Sie mit neuen verknüpften Ressourcen wie Bildern oder Schriften im CSS um? Aktualisieren Sie die App oder verknüpfen Sie die Ressourcen mit einem absoluten Pfad zum Webserver? – systempuntoout

+1

Ich benutze einen Sass, um den absoluten Pfad des Webservers in die CSS-Datei zu kompilieren. – TWilly

1

Ich denke, die beste Wahl, dies zu nicht versuchen würde mit Phonegap zu tun, sondern vielmehr Ihre dynamischen Teile zu identifizieren und implementieren diese in Javascript.

Ja, ich meine, Sie sollten in der Tat selbst verwenden Javascript ohne Phonegap, zum Beispiel über JavaScriptBridge: https://github.com/kishikawakatsumi/JavaScriptBridge

Es kann mehr Arbeit erfordert zunächst Ihre Anwendung in einen „statischen“ Teil neu zu gestalten (Ihre PhoneGap app) und dynamischer Teil (dynamisch erstellte Ansichten via JavascriptBirdge), und interacte nahtlos zwischen ihnen. Aber meiner Meinung nach wird das letztlich das beste Software-Design sein.

Stellen Sie jedoch auch sicher, dass Sie immer noch Apples AppStore Anforderungen erfüllen.

1

Das Meteor Framework bietet genau diese Funktionalität, wenn es mit PhoneGap kombiniert wird. Es ist sogar von Apple in der neuesten Entwicklervereinbarung sanktioniert. Hier sind einige technical details und dann some about Apple's view on it. App-Dateien über 3 einfache Schritte

6

cordova-app-loader ist ein einfaches Plugin zu verwenden, zu aktualisieren:

  1. check() für eine neue Manifest
  2. download() Dateien
  3. update() Ihre App!

Es unterstützt Android und iOS

+1

Cool, das scheint die perfekte Lösung zu sein. Ich werde es nächste Woche ausprobieren – 23tux

0

Check out CodePush from Microsoft. Arbeitet mit Cordova und React Native.

Es scheint der "Live Update" -Funktion von Ionic Cloud sehr ähnlich zu sein.