Cordova / Phonegap:实时更新代码库
Posted
技术标签:
【中文标题】Cordova / Phonegap:实时更新代码库【英文标题】:Cordova / Phonegap: Live update codebase 【发布时间】:2015-01-14 12:47:52 【问题描述】:我们将 Cordova 与 AngularJS 一起用于 ios 和 android 应用程序。
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 移动应用程序?