uni-app 插件使用说明
更新时间: 2024/03/14 19:21:15
uni-app 插件使用说明
针对 uniapp 编译去手机,想让 IM 自身支持推送的场景,云信提供了一份原生插件支持。步骤一共如下所示:
- uni-app 生成离线包
- 自定义基座打包
- 下载插件,并且放入工程中的插件文件夹
- 在 uni-app 开发者中心申请 APPID,生成 Appkey。
- 打开消息推送开关,勿选择 unipush 插件。
- demo 中引入插件并进行相关配置。
- 选择制作自定义基座:(1) iOS 基座配置,(2) 安卓基座配置
- 运行前选择自定义基座
- 编写注册厂商通道的代码
uni-app 生成离线包
iOS 导入到 Xcode 或 Android 导入到 Android tudio 内打包,详见uni-app 官方教程:
iOS:iOS离线打包教程
Android: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
,需要拿这个参数去向插件注册。
jsconst nim = new NIMSDK({
// ...
})
nim.on('logined', function (result) {
console.log('收到了 aosPushToken,下一步需要注册给插件', result.aosPushInfo && result.aosPushInfo.pushType)
regToken(nim, result.aosPushInfo)
})
await nim.connect()
拿到了 aosPushToken
后,就需要去调用插件,注意好环境的判断,因为只有编译去手机的环境才需要这么做,下面提供一段示范代码
jsfunction 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
})
});
}