Cordova自定义插件,解决Android混合开发向原生开发的过渡

为了解决同一包名下混合开发应用与原生应用的更新过渡问题,本文介绍了一个通过自定义Cordova插件实现应用自我卸载的方案,并提供了具体实现步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关键词:混合开发 ionic-2.1.4 + cordova-6.3.1 + angularJS
Cordova 自定义插件
插件源码:Cordova自定义插件源码

今天说说再混合开发时会用到的一个小技能,写Cordova插件。网上的例子大多是从安装环境开始,今天就简单粗暴的直接说怎么写一个自定义的插件。

需求:
公司最开始使用混合开发做了一版App(Android+IOS),但是从用户体验到界面美观都不是太理想,所以就准备开发一版原生App。貌似很幸福的一件事,小伙伴们就开始加油干了,但是准备接近完成的时候想到了一个不容忽视的问题……

项目中用到了高德地图,微信支付和支付宝支付的第三方插件。它们都是需要将你的应用包名注册到相关第三方商户服务信息中的,否则支付发起和回调是无法识别和找到你的应用的。因此新旧版衔接的时候势必在同一时间只能用一个包名,而且只有一个应用正常。当然也可以再注册一个应用,这是最正常的流程,但是你也知道公司的审批流程……
所以我们决定使用同一个包名,这样支付宝、微信等的第三方集成还保持之前的状态。

那么问题又来了。Android新版原生替换旧版混合开发的时候无法安装成功,在很多机型的Android手机上都是无法安装应用,倒过来替换却能成功。(当然包名不一样是能成功的,但是这个已经被前面说的原因pass掉了)。对比苹果,苹果好说,因为自成一个生态系统,同时国内访问Apple App Store无障碍,人家有iOS bundle ID,想换就换,新版APP更新下来自动能够使用,就像正常更新一样。Android就坑了,国内访问大Google是GameOver了。Google会有一个类似Apple的应用商店,想必也是能实现自动替换的,但是咱用不了了,而且也会有一些费用也得申请。剩下的就是个手机品牌自主开发的应用商店,那咱就别考虑了,因为无法统一的问题,咱不可能挨个上传一个app吧。至于为什么新版原生替换旧版混合会出现这样的问题,没有深究,以后必定补上一个说明博客解释这一点。时间紧任务重,我们先出一个方案,能够平滑过渡最好。

因此,想到一个方案:旧版App先按照新版App的下载地址,利用手机浏览器开启下载任务,然后让旧版App自己弹出卸载对话框,提示用户卸载否则无法更新应用。貌似有的某大型App在Android手机上也有过下载了一个新版但是和旧版能共存,访问旧版就不能访问了,估计也是解决类似问题的方案吧,所以还是要抽出时间来好好研究下。

具体的方案流程:
旧版App已经编写好了比对应用版本,然后决定是否更新应用的代码,使用到了如下插件:

cordova-plugin-file
cordova-plugin-file-opener2
cordova-plugin-file-transfer

这个可以去ionic官网上搜,安装后调用就可以了。
因为这个解决方案的代码是需要在旧版中触发的,所以我们还得借助旧版的更新将这段处理代码更新下来,然后启动旧版应用,项目初始化的时候(因为已经是旧版中的最新版了,所以下面的处理逻辑应该放到比对版本不需要更新的分支中)执行如下两步:

  1. 依照新版App地址链接,下载新版原生App的apk包:
if(window.cordova && window.cordova.InAppBrowser){
    cordova.InAppBrowser.open('http://www.btravelplus.com/app-debug.apk', '_system', 'location=no');
}
  1. 调用自定义插件,删除旧版应用(因为调取手机系统本身的卸载需要利用AndroidSDK的方法,混合开发中采用插件的形式来处理):
window.plugins.UninstallMyselfPlugin.uninstallApp(function(res){
});

顺序不可颠倒,因为走到卸载,就saygoodbye了,你让应用怎么执行下载新版的任务。

OK,如果你想更友好可以加一个对话框询问用户是否卸载,如果不卸载继续使用旧版的也是可以的,服务端没变,继续使用旧版也是没有任何问题,所以可进可退。自定义插件的逻辑很简单,就是注意配置文件的编写不要调用错了,我已经贴出来git库地址,小伙伴们可以自行查看:
[Cordova自定义插件源码]https://github.com/xinluqishi/cordovaUninstallSelfPlugin)
写插件就可以回到用txt编写java代码的初学阶段,好开心我们都年轻过,哈哈,当然你也可以使用studio。
有个小问题就是,编译插件报错,找不到这个:MATCH_UNINSTALLED_PACKAGES 原因就是以前的属性名叫这个GET_UNINSTALLED_PACKAGES后来被Deprecated了,用回这个适配更旧版本的API就可以了。

完整的调用代码如下:

var confirmPopup = $ionicPopup.alert({
    title: '提示',
    template: '请下载改版客户端并删除旧版,否则无法使用',
    okText: '确定',
    okType: 'button-positive',
});
confirmPopup.then(function(res) {
    if(res) {
       // 访问新版App地址
       if(window.cordova && window.cordova.InAppBrowser){
           //这个插件的说明可以参考官网
           //http://cordova.apache.org/docs/en/latest/reference/cordova-plugin-inappbrowser/
           cordova.InAppBrowser.open('你的原生新版App下载地址', '_system', 'location=no');
       }
       window.plugins.UninstallMyselfPlugin.uninstallApp(function(res){
           //不要写返回值,没必要
       });
    }
});

这样的话就解决了这个问题,如果有什么不足请小伙伴们指出,一定修改,我也会继续挖掘这个问题的深层原因,后补一篇博文。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值