Web

uniapp 推送相关

更新时间: 2024/03/14 19:21:12

该文档已废弃,请查看 uni-app 离线推送

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 官方教程:

步骤二:自定义基座打包(引用本地插件打包)

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

    插件下载地址

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

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

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

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

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

  4. 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 目录下

  5. 选择制作自定义基座。

    (1) iOS 基座配置

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

    (2) 安卓基座配置

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

  6. 运行前选择自定义基座。

  7. 运行到 iOS 或 Android 手机即可。

步骤三:编写注册厂商通道的代码

  1. 收到登陆事件时,能得到服务器下发的推荐该设备注册的厂商通道,参数叫 aosPushToken,需要拿这个参数去向插件注册。

    js    const nim = new NIMSDK({ 
        // ...
        })
    
      nim.on('logined', function (result) {
      console.log('收到了 aosPushToken,下一步需要注册给插件', result.aosPushInfo && result.aosPushInfo.pushType)
      regToken(nim, result.aosPushInfo)
      })
    
      await nim.connect()
    
  2. 调用插件。请注意好环境的判断,因为只有编译去手机的环境才需要这么做。示例代码如下:

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