前言
最近由于做个手机APP的OA办公系统,最终选择了uni-app。总体感觉还可以。OA的业务就会有很多的待办,为解决这一问题就选择了Unipush。这个功能官方给的文档挺丰富的,但是很多地方还是有坑,按照官网的文档,在线推送基本不会有太大问题。但是有个问题就是,离线推送。社区也有很多人卡在这里,我也是如此。在本文做个简单总结,有缘看到的同学可以少浪费点时间,本文尽量言简意赅。
关于官网的以下两点补充说明:
1)离线推送和离线接收:正确的理解是手机APP退出或者进程被杀掉还能收到推送的消息,并且点开消息能启动APP。
2)离线推送unipush已经做好了,即使离线了,再次启动APP也能接收到历史的信息。主要的问题是,APP不启动还能收到消息,这点官网也有说,但是很多同学理解有歧义或者遇到问题。
官方参考文档:
UniPush开通指南 https://ask.dcloud.net.cn/article/35716
UniPush使用指南 http://ask.dcloud.net.cn/article/35622
Unipush常见问题 https://ask.dcloud.net.cn/article/36611
认真阅读以上文档,也不一定会成功,还有几个坑,大概列举下:
1)想要离线接收消息,必须使用厂商推送,必须要去厂商申请APPID等
2)厂商申请的APPID等要填写正确,在DCloud开发者中心要填写正确,华为的申请不需要提交,也不需要上架,但是SHA256一定要填。
3)服务端下推必须通过“透传消息”类型下发推送消息。
上面几个点注意了,还是不一定会成功,下面还有坑,unipush官方说服务端下推参考个推的集成文档。个推的文档里面也有坑,虽然unipush也已说明但是还是会坑到很多人,就是官网php例子的这两行代码:
$payload = '{"title":"测试标题","content":"测试内容","sound":"default","payload":"test"}';
$intent = 'intent:#Intent;action=android.intent.action.oppopush;launchFlags=0x14000000;component=io.dcloud.HBuilder/io.dcloud.PandoraEntry;S.UP-OL-SU=true;S.title=测试标题;S.content=测试内容;S.payload=test;end';
这两行个推的demo里面没有详细的例子,初次开发下推会坑在这里,我的代码如下:
private static TransmissionTemplate TransmissionTemplateDemo(string title, string content)
{
TransmissionTemplate template = new TransmissionTemplate();
template.AppId = BaseConfig.AppId;
template.AppKey = BaseConfig.AppKey;
//应用启动类型,1:强制应用启动 2:等待应用启动
template.TransmissionType = 2;
Payload payload = new Payload();
payload.title = title;
payload.content = content;
payload.payload = "test";
//透传内容
template.TransmissionContent = JsonConvert.SerializeObject(payload); ;
Notify notify = new Notify();
notify.Content = title;
notify.Title = content;
notify.Intent = $"intent:#Intent;action=android.intent.action.oppopush;launchFlags=0x14000000;component=你的包名/io.dcloud.PandoraEntry;S.UP-OL-SU=true;S.title={title};S.content={content};S.payload=test;end";
notify.Type = NotifyInfo.Types.Type._intent;
template.set3rdNotifyInfo(notify);
//设置通知定时展示时间,结束时间与开始时间相差需大于6分钟,消息推送后,客户端将在指定时间差内展示消息(误差6分钟)
//string begin = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
//string end = DateTime.Now.AddDays(1).ToString("yyyy-MM-dd HH:mm:ss");
//template.setDuration(begin, end);
return template;
}
我在代码里注释掉的两行是个坑,个推的文档里都会有这两行,所以我没注意,一直没成功,注释掉就成功了:
//设置通知定时展示时间,结束时间与开始时间相差需大于6分钟,消息推送后,客户端将在指定时间差内展示消息(误差6分钟)
//string begin = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
//string end = DateTime.Now.AddDays(1).ToString("yyyy-MM-dd HH:mm:ss");
//template.setDuration(begin, end);
以上就是我遇到的需要注意的坑,我用winform做了一个服务端下推的demo客户端,下推华为手机测试在线离线下推接收都没问题。需要参考的同学可以自行下载(https://download.csdn.net/download/f363641380/12109647)。