Cordova / Phonegap:实时更新代码库

Posted

技术标签:

【中文标题】Cordova / Phonegap:实时更新代码库【英文标题】:Cordova / Phonegap: Live update codebase 【发布时间】:2015-01-14 12:47:52 【问题描述】:

我们将 Cordova 与 AngularJS 一起用于 iosandroid 应用程序。

iOS 的一大缺点是 Apple 的审核时间过长。在 Google 的 Playstore 中,您的应用程序几乎立即可用,或者在几个小时内可用。但是 Apple 需要很长时间来审核您的应用,即使只是很小的更改。

所以我在想,是否有办法支持某种实时更新。 这意味着,我可以提供一个 ZIP 文件或其他带有新代码库的文件,我的应用程序会检查更新,然后安装新文件。

我从appmobi 中读到了一些东西,但是有什么开源解决方案吗?

【问题讨论】:

您可能应该花一两分钟时间查看您的 iOS 开发者计划许可协议。你提出的不是一个新想法,但它不会发生,因为它违反了你与 Apple 的协议。 但我知道一些游戏会定期获取更新。他们是否也违反了协议? Content 更新是允许的,但可执行代码是不允许的。在某些情况下,代码和内容之间的差异可以说是模糊的。我不是律师,但作为一名开发人员,我唯一的建议是谨慎行事。祝你好运! 【参考方案1】:

cordova-app-loader 是一个易于使用的插件,只需 3 个简单的步骤即可更新应用文件:

    check() 获取新清单 download()文件 update()你的应用!

支持安卓和iOS

【讨论】:

酷,这似乎是一个完美的解决方案。下周我会试一试【参考方案2】:

我不知道有什么现成的解决方案,但你自己编写这样的程序应该很容易。 以下几点可以帮助您开始并考虑:

如果您想通过 zip 分发更新,您需要一个处理提取的 nativ 插件 您可能无法覆盖应用程序默认位置中的文件(取决于操作系统)。因此,您将来要更新的所有文件都必须位于您的应用具有读/写权限的文件夹中(iOS:例如 Library 或 Documents 文件夹) 现在您只需下载 zip 包,将 zip 解压到您选择的目录,然后重新启动/重新加载您的应用。 您将无法更新原生插件! Apple 可能不喜欢这样,因为您无需通过即可更改整个应用程序 他们的审核流程

【讨论】:

是的,这也是我自己实现它的方式。不幸的是,似乎还没有开源解决方案。 其实苹果没问题:meteor.com/blog/2014/10/02/Apple-hot-code-push-mobile 只要你不“改变应用程序的主要目的”。【参考方案3】:

我在我的 cordova 应用程序中执行此操作,并且在 ios 应用程序商店审核方面没有任何问题。

我正在使用 Jquery 的 ajax 函数从服务器下载 javascript 和 css 文件,我可以在没有应用商店批准的情况下更改它们,然后我可以在应用启动时注入这些脚本。

我尝试使用cordova File api,然后将文件保存在本地,但目前离线支持对我来说并不重要,而且Jquery的ajax要简单得多。

这是我使用的 jquery 代码。我有一个 bundle id 用于检测是否有新的 javascript 文件可用,否则 jquery 的 ajax 会缓存以前的请求以加快下载时间。

此解决方案让您的代码子集是动态的。我仍然有一组与应用程序捆绑在一起的基本代码,以及需要通过应用商店的原生插件 js 和原生代码。但这至少让我无需通过应用商店即可推送错误修复。

否则,我会考虑这样的解决方案: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");
    


【讨论】:

如果你更新你的 CSS,你如何处理新的链接资源,比如 CSS 中的图像或字体?您是更新应用程序还是将资源链接到 Web 服务器的绝对路径? 我使用 sass 来编译 webserver 的绝对路径到 css 文件中。【参考方案4】:

好吧,Adobe 在其 Phonegap Build 服务中提供了该服务。它叫做Hydration。

这个例子展示了在 Android 和 iOS 平台上使用它,所以我猜他们使它与 iOS 开发程序许可协议兼容。

如果您使用的是 Cordova,如果您想使用他们的构建云服务,您可能必须切换到 Phonegap CLI,这与 Cordova 的基本相同,需要一些额外的命令上传到他们的云等。

我认为有一些像 Splashscreen 这样的插件也有一些小的变化(在 config.xml 中使用 <gap>for 参数而不是 <preference>)。同样,如果 Hydration 为您解决了问题,那么更改很小,您将获得一个非常好的功能。

【讨论】:

酷,我不知道他们提供这样的服务。但尽管它很酷,但我更喜欢开源解决方案(目前还没有;)) 是的...所以,如果您最终实现了自己的解决方案...请确保将其开源 ;-)【参考方案5】:

我认为最好的选择是不要尝试使用 Phonegap 执行此操作,而是确定您的动态部分并在 Javascript 中实现它们。

是的,我的意思是你确实应该在没有 Phonegap 的情况下自己使用 Javascript,例如通过 JavaScriptBridge: https://github.com/kishikawakatsumi/JavaScriptBridge

最初可能需要更多的工作将您的应用重新设计为“静态”部分(您的 PhoneGap 应用)和动态部分(通过 JavascriptBirdge 动态创建的视图),并在它们之间无缝交互。但在我看来,这最终将是最好的软件设计。

但是,还要确保您仍然满足 Apple 的 AppStore 要求。

【讨论】:

【参考方案6】:

Meteor 框架在与 PhoneGap 结合使用时正好提供此功能。它甚至在最新的开发者协议中得到了 Apple 的认可。这里有一些technical details,然后是some about Apple's view on it。

【讨论】:

【参考方案7】:

我认为没有这样的解决方案可用,但您可以通过编程方式进行。您可以通过从服务器获取文件并更新它来更新您的 cardova 应用程序。

【讨论】:

【参考方案8】:

查看CodePush from Microsoft。适用于 Cordova 和 React Native。

似乎与 Ionic Cloud 的“实时更新”功能非常相似。

【讨论】:

以上是关于Cordova / Phonegap:实时更新代码库的主要内容,如果未能解决你的问题,请参考以下文章

我如何将 Phonegap 项目创建的 cordova 1.9 更新为 cordova 3.1

如何在 android 中远程更新我的 cordova/phonegap 移动应用程序?

为 Phonegap / Cordova iphone 应用程序设置 CMS

PhoneGap/Cordova Android 开发

Phonegap/Cordova 代码在构建时不断重置

在 iOS 上调试 Cordova (PhoneGap) 代码