uniapp 推送相关

更新时间: 2023/07/21 06:56:54

uni-app 插件使用说明

针对 uniapp 编译去手机,想让 IM 自身支持推送的场景,云信提供了一份原生插件支持。步骤一共如下所示:

  1. uni-app 生成离线包
  2. 自定义基座打包
    1. 下载插件,并且放入工程中的插件文件夹
    2. 在 uni-app 开发者中心申请 APPID,生成 Appkey。
    3. 打开消息推送开关,勿选择 unipush 插件。
    4. demo 中引入插件并进行相关配置。
    5. 选择制作自定义基座:(1) iOS 基座配置,(2) 安卓基座配置
    6. 运行前选择自定义基座
  3. 编写注册厂商通道的代码

uni-app 生成离线包

iOS 导入到 XcodeAndroid 导入到 Android tudio 内打包,详见uni-app 官方教程:

iOSiOS离线打包教程

AndroidApp 离线打包

自定义基座打包(引用本地插件打包)

  1. 下载插件,并且放入工程中的插件文件夹

插件下载地址

  1. 在 uni-app 开发者中心申请 APPID,生成 Appkey。

进入 uniapp 开发者后台,点击创建应用,选择 uni-app,填入应用名称后生成 Appid

Appid 填入 manifest.json(HBuilderX的账号需与登录uniapp开发者中心的账号一致)

点击 demo,选择左侧离线打包 Key 管理,填入 android 包名、证书签名和 iOS BundleId,点击保存生成 AppKey(离线打包使用,自定义打包不使用)

  1. 打开消息推送开关,勿选择 unipush 插件。

  1. 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. 选择制作自定义基座

(1) iOS 基座配置

其中 Bundle ID 为开发者中心填入的。证书和 profile 文件为和 Bundle ID 对应的文件。

(2) 安卓基座配置

其中 android 包名为开发者中心填入的。证书需要为华为后台注册时对应的文件。

  1. 运行前选择自定义基座

最后选择运行到 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
    })
  });
}
此文档是否对你有帮助?
有帮助
去反馈
  • uni-app 生成离线包
  • 自定义基座打包(引用本地插件打包)
  • 编写注册厂商通道的代码