Bootstrap

uniapp对接极光离线推送保姆级教程

前言:uniapp对接极光推送支持离线推送且免费所以选择了极光推送

注册极光后台,配置推送参数

android
在这里插入图片描述
ios
注意ios的证书是区分环境的:打包的证书和环境配置要相匹配
在这里插入图片描述

在这里插入图片描述

到各个厂商申请推送

安卓申请指南:https://docs.jiguang.cn/jpush/client/Android/android_3rd_param
ios:申请推送证书

uniapp从插件市场下载推送插件

搜下面两个,然后把各个厂商的推送参数配置进去
在这里插入图片描述

uniapp加入代码接收消息

 onLaunch: function() {
      //初始化极光推送
      initJPMessage() {
        var jpushModule = uni.requireNativePlugin("JG-JPush")
        jpushModule.initJPushService();
        jpushModule.setLoggerEnable(true);
        jpushModule.addConnectEventListener(result => {
          let connectEnable = result.connectEnable
          uni.$emit('connectStatusChange', connectEnable)
        });

        //获取注册id
        jpushModule.getRegistrationID((e) => {
          console.log("getRegistrationID", e)
        })

        /**
         * @description 监听别名添加与删除
         * @param code number  请求状态码 0 - 成功
           @param sequence number  请求时传入的序列号,会在回调时原样返回
           @param tags StringArray 执行tag数组操作时返回
           @param tag  string  执行查询指定tag(queryTag)操作时会返回
           @param tagEnable    boolean 执行查询指定tag(queryTag)操作时会返回是否可用
           @param alias    string  对alias进行操作时返回
           
         */
        jpushModule.addTagAliasListener(result => {
          console.log('【sk】标签别名事件回调result=>', result)
        })
      },
     //登陆完成后监听通知消息
      handleJpush() {
        var jpushModule = uni.requireNativePlugin("JG-JPush")

        jpushModule.addNotificationListener(result => {
          let notificationEventType = result.notificationEventType
          let messageID = result.messageID
          let title = result.title
          let content = result.content
          let extras = result.extras

          /**
           * @description 根据消息的类型决定后续操作,仅从通知栏消息跳转进app这种类型,做页面分发跳转操作
           * 
           * @param {string} notificationEventType  notificationArrived(应用在前台时收到消息);notificationOpened(通知栏消息跳转)
           * 
           */

          if (notificationEventType === 'notificationOpened') {
            this.handleJpushJump(extras)
          }
        });

        // 现有的业务不走这个回调
        jpushModule.addLocalNotificationListener(result => {
          let messageID = result.messageID
          let title = result.title
          let content = result.content
          let extras = result.extras
          this.handleJpushJump(extras)
        })
      },

      // 处理消息的跳转页面
      handleJpushJump(extras) {
        // 获取当前页面的实例对象
        const pages = getCurrentPages();
        const currentPage = '/' + pages[pages.length - 1]?.route;
        let eventType = extras.eventType
        let path = extras.path
        let params = extras.targetParam
        let latestVersionTargetParam = extras.latestVersionTargetParam
       
        //如果目前在当前页面,关闭当前页跳转
        if (currentPage === path) {
          uni.redirectTo({
            url: latestVersionTargetParam ? `${path}?${latestVersionTargetParam}` : `${path}`,
          })
          return
        }
        uni.navigateTo({
          url: latestVersionTargetParam ? `${path}?${latestVersionTargetParam}` : `${path}`,
        })
      }
 }

通过别名与用户建立关联

下面的data.envConfig的环境变量,区分生产环境和开发环境,由自己控制。
id 就是业务里的用户id

   CLEAR_ALIAS() {
      // #ifdef APP
      /**
       * 清除别名
       */
      var jpushModule = uni.requireNativePlugin("JG-JPush")
      jpushModule.deleteAlias({
        sequence: 1
      });
      // #endif
    },

    async SET_ALIAS(content, id) {
      // #ifdef APP
      try {
        const {
          data
        } = await getEnv()
        if (data && data.envConfig) {
          content.commit("SET_ENVIRONMENT", data.envConfig)
          var jpushModule = uni.requireNativePlugin("JG-JPush")
          console.log('重新绑定极光ALIAS', content.state.environment + '_' + id.toString())
          jpushModule.setAlias({
            alias: content.state.environment + '_' + id.toString(),
            sequence: 1
          });
        }
      } catch (e) {
        console.log("eeeee", e)
      }

      // #endif
    }

上面的都搞完就差不多了,下面是重点

避坑指南

  • 问题1:项目上线之后发现ios生产包上架之后接收不到信息,前端自检完成未发现证书,配置等问题。后来发现调用的api也需要配置apns_production参数,将apns_production设置为true为生产环境对应前端的下图配置
    在这里插入图片描述
"options":{
"time to live": 60,
"apns_production": false,
"apns_collapse id":"jiguang test 201706011100"
}
  • 问题2:小米收不到离线推送
    经过排查小米需要配置渠道id,要先到厂商申请
    https://docs.jiguang.cn/jpush/server/push/rest_api_v3_push
    在这里插入图片描述
  • 问题3:华为收不到离线消息
    经过排查,需要配置该参数
    在这里插入图片描述
    结语:反正坑挺多的,每个平台都有自己的规则,要仔细看每个平台的规则和文档
;