更新记录
1.1.7(2022-04-11)
修复OPPO、vivo无法接收离线通知的问题
1.1.6(2022-03-31)
1.升级Android友盟SDK到最新版:9.4.7的common,6.5.1的push 2.增加回调APP启动时的ERROR日志,开发者在初始化时可通过传参logcat=1开启
1.1.5(2021-06-23)
修复小米手机点离线通知可能无法打开APP的问题
查看更多平台兼容性
Android | Android CPU类型 | iOS |
---|---|---|
适用版本区间:6.0 - 11.0 | armeabi-v7a:未测试,arm64-v8a:未测试,x86:未测试 | 适用版本区间:10 - 14 |
原生插件通用使用流程:
- 购买插件,选择该插件绑定的项目。
- 在HBuilderX里找到项目,在manifest的app原生插件配置中勾选模块,如需要填写参数则参考插件作者的文档添加。
- 根据插件作者的提供的文档开发代码,在代码中引用插件,调用插件功能。
- 打包自定义基座,选择插件,得到自定义基座,然后运行时选择自定义基座,进行log输出测试。
- 开发完毕后正式云打包
付费原生插件目前不支持离线打包。
Android 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/android
iOS 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/ios
注意事项:使用HBuilderX2.7.14以下版本,如果同一插件且同一appid下购买并绑定了多个包名,提交云打包界面提示包名绑定不一致时,需要在HBuilderX项目中manifest.json->“App原生插件配置”->”云端插件“列表中删除该插件重新选择
友盟推送SDK
支持华为、小米、魅族、vivo、OPPO离线下发。
插件配置
Android:
集成的友盟SDK版本为:com.umeng.umsdk:common:9.4.7,com.umeng.umsdk:asms:1.6.0,com.umeng.umsdk:push:6.5.1。
添加插件后需要在插件管理页面配置商户在友盟的Android应用appkey、message secret,如果需要华为、小米、魅族、vivo、OPPO离线下发功能,也需要配置对应的参数,如下图:
注:由于小米、魅族、华为的appid为纯数字,纯数字在meta-data里面会识别为long,通过getString方法拿不到配置信息,所以需要在配置appid时,均需要按照appid=1234格式配置。小米的appkey也是纯数字,要按appkey=1234格式配置。vivo的appid也是纯数字,但配置时不需要加前缀appid=,直接配置vivo开放平台的appid即可。
未按以上配置,设备离线是将收不到离线通知。
如果未收到离线通知,请按下列步骤检查:
1.检查插件参数配置是否正确
2.检查在线通知是否能收,如果不能,检查友盟appkey、secret是否正确
3.检查是否已初始化,插件回调了device_token表示初始化成功
4.首次安装启动时,等几分钟再杀进程测试离线,友盟上送第三方token需要一点时间
另外,请确保勾选支付宝支付模块后再打包,否则可能无法获取device_token。
重要补充:
离线通知需要指定mi_activity=iread.m.bbc.push.MipushTestActivity,否则点击通知后无法接收点击事件。
华为离线推送需要额外处理,不然无法收到离线消息:
1.首先配置AppGallery Connect ,配置好后在项目设置中,下载agconnect-services.json备用。
2.在并按照友盟华为通道文档设置好消息回执。
3.下载示例项目ZIP,解压后在nativeplugins目录中找到本地插件:nrb-huawei-agconnect-json-plugin。
4.将插件拷贝到你uni-app项目中的nativeplugins目录下面。
5.将步骤1中下载的agconnect-services.json拷贝到nrb-huawei-agconnect-json-plugin插件Android/assets目录下面。
6.在manifest.json的App原生插件配置中,选择本地插件,将nrb-huawei-agconnect-json-plugin插件勾选后与本友盟推送SDK一起提交云打包。
iOS:
集成的友盟SDK版本为:UMCommon7.1.0,UMCommonLog1.0.0,UMPush3.2.4
需要在插件管理页面配置商户在友盟的iOS应用appkey,如果需要开启调试模式,也可打开调试开关,如下图:
注:SDK已设置后台运行模式:remote-notification,开发者可以不需要手动添加。
调用方式
合规指引
2021年5月1日新政要求用于同意授权后才能收集用户数据:http://www.cac.gov.cn/2021-03/22/c_1617990997054277.htm
合规请友盟合规指南:https://developer.umeng.com/docs/67966/detail/207155
注意:需要在App.vue里的onLaunch()里面初始化插件。
Android
参考友盟延迟初始化方案:https://developer.umeng.com/docs/67966/detail/179087
// 推送SDK初始化,注意只有用户同意隐私协议后,才能传agreement=1,否则可能APP会被下架
const upush = uni.requireNativePlugin('nrb-upush-plugin')
// 监听消息透传,Android点击离线通知后才能收到回调
upush && upush.addCustomMessageListener( res => {
console.log("upush callback: res="+JSON.stringify(res))
})
// 再初始化
upush && upush.init({"agreement":"0"}, res => {
console.log("upush init result for Android: res="+JSON.stringify(res))
})
//用户同意隐私协议后,调用延迟初始化实际初始化,device_token在init方法传入的代码块中回调
upush.delayInit({})
iOS
// 推送SDK初始化,注意只有用户同意隐私协议后,才能调用初始化,否则可能APP会被下架
const upush = uni.requireNativePlugin('nrb-upush-plugin')
// 先监听消息透传,iOS点击离线通知后才能收到回调
upush && upush.addCustomMessageListener( res => {
console.log("upush callback: res="+JSON.stringify(res))
})
// 再初始化
upush && upush.init({}, res => {
console.log('upush init result for iOS: res='+JSON.stringify(res))
})
调用参数及回调
Android/iOS:
init参数格式:{“agreement”:0},iOS不需要传参 字段说明
参数名 | 是否必须 | 参数格式 | 说明 |
---|---|---|---|
agreement | 否 | int | Android: 0:用户未同意隐私协议(默认); 1:已同意。 iOS: 无需传递 |
offlinetoken | 否 | int | Android: 0:不回调厂商token(默认); 1:回调厂商token,厂商通道初始化成功时返回。 通过addCustomMessageListener传递的callbcak回调 可用于调试厂商通道是否集成成功 iOS: 无需传递 |
logcat | 否 | int | Android: 0:不回调启动时APP的ERROR日志(默认); 1:回调启动时APP的ERROR日志,初始化后约延时5秒返回。 通过addCustomMessageListener传递的callbcak回调 可用于辅助调试集成失败的问题 正式打包请不要传,以免影响性能 iOS: 无需传递 |
回调结果:{"success":0,"device_token":"tk","channel":"baidu","errmsg":""}
字段说明
参数名 | 是否必须 | 参数格式 | 说明 |
---|---|---|---|
success | 是 | int | 0:成功;<0:失败 |
errmsg | 否 | string | 错误信息 |
device_token | 否 | string | 设备id,success=0时返回 |
channel | 否 | string | iOS固定返回:App Store android返回:打包时配置的渠道key=UMENG_CHANNEL对应的渠道 |
addCustomMessageListener回调的是友盟推送过来完整信息,SDK不会对回调消息做二次封装。init时提交了offlinetoken=1,也会通过此接口回调厂商token。
注意:Android会display_type=message的自定义透传消息,及用户在点击通知时回display_type=notification的通知消息。
Android回调例子:
透传消息:
{"policy":{"expire_time":"2021-02-10 09:42:48"},"description":"测试","production_mode":true,"appkey":"5ec779b4db","payload":{"body":{"custom":"测试消息透传"},"display_type":"message"},"device_tokens":"ApU58IPQsPgV1_23GdZYIKd-OP","type":"unicast","timestamp":"1612662310962"}
点击通知后回调的消息:
{"display_type":"notification","extra":{"aa":"ab","c的":"d"},"body":{"after_open":"go_app","ticker":"3333336666666","title":"3333336666666","play_sound":"true","text":"22228888888"},"msg_id":"uu72s08162315791543810"}
厂商离线token回调:
{"huaweiToken":"1111111111111111111111111"}
{"xiaomiToken":"1111111111111111111111111"}
启动日志回调:
{"logcat":"03-30 16:38:28.594 19201 19404 E NAccs.MsgDistribute: handBroadCastMsg command:1"}
iOS回调例子:
{"policy":{"expire_time":"2021-02-10 09:46:00"},"description":"测试","production_mode":true,"appkey":"5ef8c3f0","payload":{"aps":{"alert":{"title":"测试主标题","subtitle":"测试副标题","body":"测试通知内容"},"sound":"default"}},"device_tokens":"ApU58IPQsPgV1_23GdZ","type":"unicast","timestamp":"1612662398142"}
注:静默推送时(即payload.aps.content-available=1时)会实时回调,否则只有在点击通知时才回调。
常见问题:
1.未回调拿到device_token
检查步骤:a. 检查插件各项参数是否正确
b. 初始化时打开logcat=1,检查是否有“java.lang.NoClassDefFoundError: Failed resolution of: Lcom/ta/utdid2/device/UTDevice;”的错误日志,如有,则在manifest.json的APP模块配置中,勾选支付宝支付模块。原因是友盟使用了阿里的uttid包,插件未避免勾选了支付宝支付模块的APP打包失败,而未添加此包。