uni-app使用unipush推送问题汇总

14,259 阅读3分钟

关于oppo和小米手机收不到消息的问题

OPPO 推送的应用信息需要应用上线后,才能获取。

关于华为手机离线推送厂商渠道失败的问题

华为平台创建PUSH权益的时候,sha256指纹证书需要填写上,

并且华为推送测试需要使用自有证书打包;(华为渠道有sha256指纹证书检验)

华为平台sha256指纹证书填写如图:

上传iOS证书提示“证书环境错误的问题

导证书不要把钥匙串也导进来,记得是推送证书,不是打包证书,两个不要搞混了。

关于推送的监听问题

推送的消息分为两种 ,1:通知消息 2:透传消息

(1)通知消息的推送 ,会在消息中心显示,点击通知启动(激活)应用到前台运行,触发“click”事件。

(2)透传数据的推送,可以响应click和receive。

  1. 发送透传数据的格式是标准格式({title:"通知标题",content:"通知内容",payload:"通知测试"}),会在消息中心展示,并且这个时候当用户点击这个消息,就会响应click事件,只能响应click事件。

  2. 发送的透传数据不是标准格式并且当前应用在活动,同时满足这些条件,才可以响应receive事件,并且不会在消息中心展示。

总结为:

  • 触发click事件: 发送透传数据并且格式为标准格式,会在消息中心展示。

  • 触发receive事件:发送透传数据且格式为非标准格式且应用在活动,不会在消息状态栏显示。

ios:

  • 在线:只能响应receive,不会在系统消息中心显示推送通知。

  • 离线:使用苹果APNS通道下发推送通知,手机接收后在系统通知栏中显示,点击消息后启动应用(如果已经启动则从后台切换到前台),同时触发“click”事件。

Android:

  • 在线(个推推送通道可用):推送通知和透传消息都使用个推的推送通道下发推送消息。

  • 离线(个推推送通道不可用):如果符合厂商推送的厂商手机(配置了手机厂商推送参数并且在对应厂商的手机上),则使用厂商推送通道下发推送消息;否则使用个推的离线推送通道,离线消息会存储在消息离线库,离线时间内APP在线后下发推送消息。

在App.vue文件onLaunch方法中具体代码表现为:

plus.push.setAutoNotification(true)

//【APP在线】,收到透传消息通过,不会提醒至通知栏目,需要发送本地消息,再进行点击触发的点击事件。    
//【APP离线】,收到离线透传消息,必须通过Java后台的Intent字符串携带payload,且符合格式才能触发click事件,格式不符合不会触发  
plus.push.addEventListener("click", function(msg) {
 var payload;
 console.log("addEventListener click:" + JSON.stringify(msg));
 if (isIOS) {
  //APP离线点击包含click属性,这时payload是JSON对象 
  if (msg.type && msg.type == "click") {
   payload = msg.payload;
  } else {
   //APP在线,收到消息不会包含type属性,这时的payload是JSON字符串,需要转为JSON对象 
   payload = JSON.parse(msg.payload);
  }
  navigateTo(payload)
 } else {
  payload = JSON.parse(msg.payload);
  if (typeof payload === "string") {
   payload = JSON.parse(payload)
  }
  navigateTo(payload)
 }
}, false);


plus.push.addEventListener('receive', function(msg) {
 console.log("addEventListener receive:" + JSON.stringify(msg));
 if (isIOS) {
  //【APP离线】收到消息,但没有提醒(发生在一次收到多个离线消息时,只有一个有提醒,但其他的没有提醒)    
  //【APP在线】收到消息,不会触发系统消息,需要创建本地消息,但不能重复创建。必须加msg.type验证去除死循环     
  if (!msg.aps && msg.type == "receive") {
   //创建本地消息,发送的本地消息也会被receive方法接收到,但没有type属性,且aps是null    
   plus.push.createMessage(msg.content, JSON.stringify(msg.payload), { title: msg.title });
  }
 } else {
  //如果是Android,当APP在线时,收到透传消息不会进入系统消息,需要发送本地提醒。  
  plus.push.createMessage(msg.content, JSON.stringify(msg.payload), { title: msg.title });
 }
});

持续更新unipush各种问题,欢迎提问!

本文使用 mdnice 排版