有关于uniApp的热更新和消息推送
大家好,这是一个java小白第一次写博客,写的不好,大家见谅哈,多多指教!!!
uniApp的热更新
这次接到任务是做uniApp的热更新和消息推送,对我这种完全没有接触过app的小白来说,感觉还是压力不小,之前都不知道app是如何的一个情况,但还是答应下来了,多接触多学习才会嘛
1.首先我去请教了做app的大佬,讲解了一下热更新和消息推送的逻辑理论
2.热更新我们使用的最简单的想法,不知道各位大佬是如何做的,我是直接后端获取一个更新包的列表,取出其中最新的那一条,然后分“wgt"和“apk”包,因为我们暂时只做了安卓版本的app
3 逻辑是以版本号的前面了两位来区分是大版本更新(apk)以版本号两位后的作为小版本更新(wgt)
一个很简单的逻辑,先获取当前数据库最新版本号,然后对比是否为最新代码,如果不是,就判断前两位是否相同来确定更新为wgt还是apk
下面是sql语句
根据创建时间获取倒序的最新一条(写的不好,各位大佬多多指教)
接下来传给前端就可以了
uniApp的消息推送
先放一波指南和常见问题吧,我下面说的是我遇到的坑,分享一下
服务端api接口推送调用文档
(都是在官方获取的)
消息推送中间遇到了很多问题还是比较费心神的,因为周围的人基本上没咋做过app,想请教都不是很好请教,只有问了很多的技术支持
1.首先要做消息推送我们当然要先考虑用哪个插件,考虑了极光推送和unipush后选择了unipush
2.消息推送基本上就是后端的活了,用了unipush后还是很快就完成了
3.开始使用的是这套推送模版和sdk也是在官网找到的,但是有些限制,地址我就不放给大家了
4.使用了这套模版后,能够成功的在线推送消息到app但是不能实现离线推送,这里以华为手机为例子,各大安卓手机平台都是要开通厂商通道才能实现离线推送的
5.在我们开通了华为的厂商通道后又使用了另外一套模版,但是问题来了,我笑了,这套模版可以离线推送,但是不能在线,我现在手里两个,一个可以离线一个可以在线,难道我自己做判断吗,就很难,哈哈,中间还拨打了华为官方的技术支持的电话,虽然没有解决问题,但是态度还是特别好了,熬夜到晚上三点钟,后来测试的手机没电了,暂停先回家睡觉。
6.后来加到了unipush个推到技术支持的微信群,获取到了新的模版
@Override
public Result appPush(String remark, String title) {
GtApiConfiguration apiConfiguration = new GtApiConfiguration();
//填写应用配置
apiConfiguration.setAppId(appId);
apiConfiguration.setAppKey(appKey);
apiConfiguration.setMasterSecret(masterSecret);
apiConfiguration.setDomain("https://restapi.getui.com/v2/");
// 实例化ApiHelper对象,用于创建接口对象
ApiHelper apiHelper = ApiHelper.build(apiConfiguration);
// 创建对象,建议复用。目前有PushApi、StatisticApi、UserApi
PushApi pushApi = apiHelper.creatApi(PushApi.class);
PushDTO<String> pushDTO = new PushDTO<String>();
// 设置推送参数
pushDTO.setRequestId(System.currentTimeMillis() + "");//requestid需要每次变化唯一
//配置推送条件
// 1: 表示该消息在用户在线时推送个推通道,用户离线时推送厂商通道;
// 2: 表示该消息只通过厂商通道策略下发,不考虑用户是否在线;
// 3: 表示该消息只通过个推通道下发,不考虑用户是否在线;
// 4: 表示该消息优先从厂商通道下发,若消息内容在厂商通道代发失败后会从个推通道下发。
Strategy strategy = new Strategy();
strategy.setDef(1);
Settings settings = new Settings();
settings.setStrategy(strategy);
pushDTO.setSettings(settings);
//安卓离线厂商通道推送消息体
PushChannel pushChannel = new PushChannel();
AndroidDTO androidDTO = new AndroidDTO();
Ups ups = new Ups();
ThirdNotification notification1 = new ThirdNotification();
;
notification1.setTitle(title);
notification1.setBody(remark);
notification1.setClickType("intent");
notification1.setIntent("intent:#Intent;launchFlags=0x04000000;action=android.intent.action.oppopush;component=io.dcloud.HBuilder/io.dcloud.PandoraEntry;S.UP-OL-SU=true;S.title=测试标题;S.content=测试内容;S.payload=test;end");
ups.setNotification(notification1);
androidDTO.setUps(ups);
pushChannel.setAndroid(androidDTO);
pushDTO.setPushChannel(pushChannel);
PushMessage pushMessage = new PushMessage();
pushDTO.setPushMessage(pushMessage);
pushMessage.setTransmission("{title:" + title + ",content:" + remark + ",payload:\"自定义数据\"}");
ApiResult<TaskIdDTO> apiResult = pushApi.pushAll(pushDTO);
if (apiResult.isSuccess()) {
return Result.succeed(apiResult.getData());
} else {
return Result.failed(apiResult.getMsg());
}
}
这个完整的是有苹果的ios通道的,因为我们的app没有ios版本所以我就没有用,去掉了,注意把Intent中的compoent改为自己的包名,下面是对应的sdk下载地址
7.你以为这就结束了其实并没有,我发现我还是不能实现离线推送,这就涉及前端问题了,其实因为前端一直使用的Hbuilderx基座打包测试的千万不要用基座打包测试呀,用自有证书打签名包,云打包测试离线,参数都用自己的参数,别使用Dcloud官方的参数
8.unipush后台 厂商配置那边 相关厂商参数 json文件 都上传保存 用自有证书打包 云打包,就可以了,测试成功,离线在线都能够成功的实现推送(华为开通厂商通道相对简单,小米的话就要企业账号了)
至此小白的第一个博客就结束了,希望各位大佬能多多指点