uniapp 推送相关
更新时间: 2022/08/24 14:13:33
uni-app 插件使用说明
针对 uniapp 编译去手机,想让 IM 自身支持推送的场景,云信提供了一份原生插件支持。具体使用步骤见下文。
- uni-app 生成离线包。
- 自定义基座打包。
- 下载插件,并且放入工程中的插件文件夹。
- 在 uni-app 开发者中心申请 APPID,生成 Appkey。
- 打开消息推送开关,勿选择 unipush 插件。
- demo 中引入插件并进行相关配置。
- 选择制作自定义基座:(1) iOS 基座配置,(2) 安卓基座配置。
- 运行前选择自定义基座。
- 编写注册厂商通道的代码。
步骤一:uni-app 生成离线包
iOS 导入到 Xcode 或 Android 导入到 Android tudio 内打包,详见uni-app 官方教程:
步骤二:自定义基座打包(引用本地插件打包)
-
下载插件,并且放入工程中的插件文件夹。
-
在 uni-app 开发者中心申请 APPID,生成 Appkey。
进入 uniapp 开发者后台,点击创建应用,选择 uni-app,填入应用名称后生成 Appid
Appid 填入 manifest.json(HBuilderX的账号需与登录uniapp开发者中心的账号一致)
点击 demo,选择左侧离线打包 Key 管理,填入 android 包名、证书签名和 iOS BundleId,点击保存生成 AppKey(离线打包使用,自定义打包不使用)
-
打开消息推送开关,勿选择 unipush 插件。
-
demo 中引入插件并进行相关配置。
打开根目录下的
manifest.json
文件,选择左侧的 “App原生插件开发”,选择本地插件后填入推送配置信息注意,安卓推送配置注册:
- 需要在小米、华为、OPPO、VIVO、魅族的开发者后台,用同一个的 android 应用的包名注册应用获得离线推送需要各厂商的 appID、appKey、appSerect。
- 得到各个厂商的 appID、appKey、appSerect 后,需要去云信后台注册获得证书名(CertificateName)
- 相关配置填入
manifest.json
中
特殊说明:
- 因FCM 厂商需要单独配置 json 及对应原生插件库,不在此插件支持范围,如需接入,需使用 uni-app 本地打包导入 AndroidStudio。
- 厂商通道集成, 参数顺序乱七八糟,云信也很无奈:),因为uni-app插件的参数是无序的。
- appkey 和 appid 需要加
"\"
强制转换成字符串类型,防止插件读取配置时出现错误
华为开发者后台下载的 agconnect-services.json 文件,需要放入安卓插件的 assets 目录下
-
选择制作自定义基座。
(1) iOS 基座配置
其中 Bundle ID 为开发者中心填入的。证书和 profile 文件为和 Bundle ID 对应的文件。
(2) 安卓基座配置
其中 android 包名为开发者中心填入的。证书需要为华为后台注册时对应的文件。
-
运行前选择自定义基座。
-
运行到 iOS 或 Android 手机即可。
步骤三:编写注册厂商通道的代码
-
收到登陆事件时,能得到服务器下发的推荐该设备注册的厂商通道,参数叫
aosPushToken
,需要拿这个参数去向插件注册。const nim = new NIMSDK({ // ... }) nim.on('logined', function (result) { console.log('收到了 aosPushToken,下一步需要注册给插件', result.aosPushInfo && result.aosPushInfo.pushType) regToken(nim, result.aosPushInfo) }) await nim.connect()
-
调用插件。请注意好环境的判断,因为只有编译去手机的环境才需要这么做。示例代码如下:
function regToken (nim, aosPushInfo = {}) { console.log('得到 aosPushInfo 为', aosPushInfo) // 判断系统类型,非手机环境、不支持 uni.requireNativePlugin 的则退出 const systemInfo = uni.getSystemInfoSync() || {} const os = systemInfo.platform ? systemInfo.platform.toLowerCase() : '' if (os !== 'ios' && os !== 'android' ) { console.warn('所在环境非 IOS 或者 Android') return } if (typeof uni.requireNativePlugin !== 'function') { console.warn('所在环境不支持 uni.requireNativePlugin') return } // 获取前文注入工程的的原生插件 let nimPushPlugin = uni.requireNativePlugin('NIMUniPlugin-PluginModule'); // 订正 pushType。其中 ios 没有 aosPushInfo 参数的,需要特意判断下。 // 如果是 android 设备,但服务器并没有下发推荐的通道,那么可能是 FCM 的,注意,FCM 通道推送不成功。 var pushType = ""; if (aosPushInfo && aosPushInfo.pushType) { pushType = aosPushInfo.pushType; } else if (os === 'ios'){ pushType = ""; } else if (os === 'android') { pushType = "8"; } if (typeof nimPushPlugin.getDeviceToken !== 'function') { console.warn('没有集成 NIMUniPlugin-PluginModule 插件') return } // 和原生插件交互,注册厂商通道 nimPushPlugin.getDeviceToken({ suggestPushType: pushType }, (ret) => { console.log('收到了 token:', ret, pushType) var newTokenName = ''; switch(pushType) { case "5": newTokenName = 'DEMO_MI_PUSH'; break; case "6": newTokenName = 'DEMO_HW_PUSH'; break; case "7": newTokenName = 'DEMO_MZ_PUSH'; break; case "8": newTokenName = 'DEMO_FCM_PUSH'; break; case "9": newTokenName = 'DEMO_VIVO_PUSH'; break; case "10": newTokenName = 'DEMO_OPPO_PUSH'; break; default: newTokenName = 'ENTERPRISE'; //ios 推送通道 break; } // 将注册好的 token 通知 IM 服务器 nim.user.updatePushToken({ tokenName: newTokenName, token: ret }) });