uni-app中的推送

需求:最近公司要做推送,用的是uni-app,这里备注一下

 

App.vue里这样操作:

分别是iOS 和Android的在线创建推送,以及点击事件的处理,这里点击事件存储一下,然后发送消息在首页处理推送。

如果在这里处理,会有先跳转推送页再返回首页的问题。

    plus.push.addEventListener('click', function (msg) {
      // 存储一下点击后的推送信息
      // uni.setStorageSync('receive', msg);
      // 2 处理跳转  如果没登录 去登录
      // const resos = uni.getSystemInfoSync();
      // if (resos.platform === 'ios') {}
      if (!userStore.isLogin) {
        uni.switchTab({
          url: '/pages/autoLogin/index',
        });
        return;
      }
      if (msg.aps) {
        // 离线 到首页再执行
        uni.setStorageSync('msg_payload', msg.payload);
        uni.$emit('msgPayload');
      } else {
        // 在线可立即执行 但是不行,离线状态点击在线推送不行,所以也到首页再执行
        uni.setStorageSync('msg_payload', msg.payload);
        uni.$emit('msgPayload');
      }
    });
    // 在线推送点击  receive 内创建推送弹窗
    uni.onPushMessage(res => {
      if (res.type == 'click') {
        console.log('点击业务在addEventListener处理');
      }
      if (res.type == 'receive') {
        // 创建推送显示
        // uni.setStorageSync('receive', res);
        // 创建推送显示  ios
        console.log('===onPushMessage======res=============', res);
        const resos = uni.getSystemInfoSync();
        if (resos.platform === 'ios') {
          var content_obj = JSON.parse(res.data.content);
          let titleStr = decodeURIComponent(content_obj.title);
          let contentStr = decodeURIComponent(content_obj.content);
          uni.createPushMessage({
            icon: '',
            title: titleStr || '连xx',
            content: contentStr || '您有一个通知',
            payload: content_obj.url,
            success: res => {
              console.log('成功创建', res);
            },
          });
        } else {
          // 创建推送显示  android
          let contentStr = decodeURIComponent(res.data.content);
          uni.createPushMessage({
            icon: '',
            title: res.data.title || '连xx',
            content: contentStr || '您有一个通知',
            payload: res.data.payload.url,
            success: res => {
              console.log('成功创建', res);
            },
          });
        }
      }
      plus.runtime.setBadgeNumber(0);
    });
    // 获取客户端标识
    uni.getPushClientId({
      success: res => {
        let push_clientid = res.cid;
        uni.setStorageSync('cid', push_clientid);
      },
    });
    // #ifdef APP-PLUS
    let pinf = plus.push.getClientInfo();
    if (pinf && pinf.clientid) {
      uni.setStorageSync('cid', pinf.clientid);
    } else {
      var obtainingCIDTimer = setInterval(function () {
        pinf = plus.push.getClientInfo();
        if (pinf.clientid) {
          uni.setStorageSync('cid', pinf.clientid);
          clearInterval(obtainingCIDTimer);
        }
      }, 50);
    }
    // #endif
    plus.runtime.setBadgeNumber(0);

首页这样处理:

如果是离线推送,冷启动,外部的msgPayload()生效,在线推送的话,

uni.$on('msgPayload', () => {
    msgPayload();
  });
生效。跳转后,移除存储的跳转信息。
onReady(() => {
  msgPayload();
  uni.$on('msgPayload', () => {
    msgPayload();
  });
});

// 不同意隐私 关闭Model
function msgPayload() {
  let payload = uni.getStorageSync('msg_payload');
  if (payload && userStore.isLogin) {
    var redirectUrl = decodeURIComponent(payload);
    console.log('=离线=======redirectUrl=======', redirectUrl); // 123456
    setTimeout(() => {
      if (isHttpLink(redirectUrl)) {
        redirectUrl = getJoinSSOUrl(redirectUrl, userStore.token);
      }
      if (isTabBarLink(redirectUrl)) {
        uni.switchTab({
          url: redirectUrl,
        });
      } else {
        jumpSupport(redirectUrl, '1');
      }
    }, 500);
    setTimeout(() => {
      uni.removeStorageSync('msg_payload');
    }, 1000);
  }
}

 

posted @ 2024-01-14 13:22  甘林梦  阅读(88)  评论(0编辑  收藏  举报