筋斗云框架可以用来做安卓或IOS的原生应用,以便用户能更快捷的打开应用以及使用手机提供的诸如摄像头、麦克风等各种原生设备功能,提供更友好的用户体验。
使用筋斗云框架制作的应用与原生应用有所区别,一般称为混合应用,它通过Cordova工具包生成Web应用容器,加载前端Web应用作为“内容”,Web应用通过调用容器接口(一般也称插件)来操作原生窗口。
通常的混合应用要将网页内容内嵌入容器打包发布,Web应用有任何改动,都需要重新打包发布新版本。
筋斗云采用容器与内容分离技术,可以极大的减少原生版本发布次数,避免上传应用市场及审核带来的不便。
这一技术的核心是解决两个问题:1. Web应用与容器分离后,如何调用容器功能。2. Web应用修改更新后,如何兼容市场上仍存在的各种老版本容器。
首先,Web应用与容器分离后,对容器接口的调用会失败。其原因是缺少容器的支持库,包括基础库(如cordova.js)以及各接口声明文件。这些支持库可以从各平台的安装包中分离出来放入Web应用中,并由Web应用的主引导页面根据当前平台是IOS或安卓,自动加载相应的平台容器支持库。
一般需要从安装包中分离出以下文件:
cordova.js
cordova_plugins.js
plugins/ (文件夹)
将它们放到Web应用中。注意:每个移动平台上的文件都是不一样的,需要分别放到不同的文件夹:安卓存放到文件夹 m/cordova 中,IOS存放到 m/cordova-ios 中。
其次,当为容器增加新插件功能后,就必须考虑对旧版本的容器的兼容,因为即使新的应用上架后,用户也不一定能立即升级到最新版本。这样,最新的Web应用上线后,如果运行在老版本的容器中,对新插件的调用就会失败。
解决方法是引入版本管理机制,根据不同容器版本,动态加载该版本可用插件。此外,由于不同的应用(比如客户端,商户端)会共用这些的支持库,必须为每个应用创建标识,再按不同应用的不同版本加载插件。
我们先在cordova_plugins.js中为每个插件增加一个filter属性,配置它可用于哪些应用的哪些版本,像这样:
// 应用标识:user表示客户端,store表示商户端
var plugins = [
{
"id": "cordova-plugin-inappbrowser.inappbrowser",
...
"filter": [ ["user", 2], ["store", 1, 3]
}
...
]
属性filter的格式为[ [{app}, {verFrom}, {verTo?} ], ... ]
. 以上filter的含义即是,客户端从版本2开始支持该插件,商户端从版本1到版本3支持该插件(版本4开始该插件不再使用)。
容器需要将当前版本传给应用程序,目前是通过在加载Web应用时,在URL中增加cordova
参数来实现的,如cordova=3
表示容器版本为3. 这样每个Web应用根据自己的应用标识与传入的版本号,对这些filter进行分析,就可以计算出可用的容器接口。
有了内容与容器分离机制后,一般只有在插件接口增删的情况下才需要到应用市场上发布新版本,而Web应用随时可以自主更新线上版本,即永远是最新版本。