android系统使用包名(packagename)来判定应用程序的同一性,但是由于包名可以由开发者自由设置,为了保护应用程序不被其他开发者开发的同包名应用覆盖,用于发布的Android应用程序需要加上开发者签名。签名是保证app不被第三方恶意替换。
在应用程序被升级的时候,Android系统将会验证被升级的应用程序包与升级后的应用程序包是否使用了同样的开发者签名,如果一致,该应用程序可以被升级;如果不一致,那么将被视为非同一开发者开发的应用程序,用户需要先卸载已经安装的应用,然后再安装新应用。在卸载的过程中,应用在android系统中所保存的设置信息(SavedPreferences)将被删除,以保护应用本地保存的资料不被盗取。
根据现有应用市场的升级规则,包名一致,才会提醒升级,升级时,签名不一致,无法升级。
检测到包名一致且版本不一致——>提示升级——>签名不一致——>升级失败。
包名一致签名一致,就升级成功了。
HBuilderX1.6.5起,uni-app支持生成App资源升级包wgt。
wgt文件称为使用浏览器作为一个小型的Web应用程序部件,这些文件包含有关部件配置,图像,索引,样式表,JavaScript等信息,通常是在一个压缩归档格式。解压后的文件目录结构如下:
全量apk包目录结构如下:
首先,更新manifest.json中的版本号。比如之前是1.0.0,那么新版本应该是1.0.1或1.1.0。
然后,在HBuilderX中生成升级包(wgt)。
菜单->发行->原生App-制作移动App资源升级包
生成结束会在控制台告知升级包的输出位置。
应用升级需要服务端与客户端配合完成,下面以本地测试过程中的操作举例说明:
传入参数
返回参数
下面是一个简单的服务端判定的示例,仅做参考,实际开发中根据自身业务需求处理。
客户端检测升级在App.vue的onLaunch中检测升级,代码如下:
注意事项
但实际上热更新使用非常普遍,不管是原生开发中还是跨平台开发。
Apple曾经禁止过jspatch,但没有打击其他的热更新方案,包括cordovar、reactnative、DCloud。封杀jspatch其实是因为jspatch有严重安全漏洞,可以被黑客利用,造成黑客可篡改其他App的数据。
使用热更新需要注意:
用户对于热更新及整包更新的感知几乎是无差别的,同样需要主动触发用户下载安装,只不过包的大小不一致。
接口约定如下数据接口约定仅为示例,开发者可以自定义接口参数。
请求方法:GET
请求数据:
{"appid":plus.runtime.appid,"platform":platformFlag,"version":plus.runtime.version}其中,platformFlag为手机系统标识,可通过如下方法获取:
asyncinitSystemInfo(){ uni.getSystemInfo({ success(e){ console.log('Thesysteminfoeis:',e) //#ifndefMP getApp().globalData.deviceInfo=e Vue.prototype.StatusBar=e.statusBarHeight; if(e.platform==='android'){ getApp().globalData.deviceInfo.platformFlag='0'//Android系统标识 Vue.prototype.CustomBar=e.statusBarHeight+50; }else{ getApp().globalData.deviceInfo.platformFlag='1'//IOS系统标识 Vue.prototype.CustomBar=e.statusBarHeight+43; } //#endif //#ifdefMP-WEIXIN Vue.prototype.StatusBar=e.statusBarHeight; constcustom=wx.getMenuButtonBoundingClientRect(); Vue.prototype.Custom=custom; Vue.prototype.CustomBar=custom.top-e.statusBarHeight; //#endif //#ifdefMP-ALIPAY Vue.prototype.StatusBar=e.statusBarHeight; Vue.prototype.CustomBar=e.statusBarHeight+e.titleBarHeight; //#endif } });},响应数据:
在App.vue的onLaunch中,发起升级检测请求,如下:
需维护一张数据表,用于维护APP版本信息,主要字段信息如下:
根据客户端接收的版本号,比对服务端最新版本号,决定是否需要升级,若需升级则返回升级信息(rleasenotes、更新包地址等)
开发者可以根据服务端开发语言,自己实现升级检测逻辑,如下是一个php示例代码:
APP发版时,应注意维护manifest.json中versionName、versionCode字段,以免影响版本升级。
plus.runtime.getProperty(plus.runtime.appid,function(widgetInfo){ console.log(widgetInfo.version);})四、Uni-app版本升级中心uni-app提供了一整套版本维护框架,包含升级中心uni-upgrade-center-Admin、前台检测更新uni-upgrade-center-app。
uni-app提供了版本维护后台应用升级中心uni-upgrade-center-Admin,升级中心是一款uni-admin插件,负责App版本更新业务。包含后台管理界面、更新检查逻辑,App内只要调用弹出提示即可。
在上传安装包界面填写此次发版信息,其中包地址可以选择手动上传一个文件到云存储,会自动将地址填入该项。
如果是发布苹果版本,包地址则为应用在AppStore的链接。
升级中心有以下功能点:
uni-upgrade-center-app负责前台检查升级更新。
检测更新视图如下图所示:
该插件提供如下功能:
注意:在手机基座上运行时获取到的版本号和appid是hbuilder和hbuilder的版本需要在文件里面手动设置。