uniapp消息推送

1,277 阅读3分钟

1 . 在manifest.json =》 App模块配置中勾选消息推送及uniPush选项开启消息推送功能

2 . 在unicloud开发者中心添加项目应用,添加好后进入应用在 Uni push=》消息推送中发送消息测试是否可以收到推送的消息

3 . 在unicloud开发者中心 =》 你创建的应用 =》Uni push=》厂商推送设置中配置各厂商推送设置(app在线时消息走的是第三方消息推送平台,离线时走的是手机厂商的推送通道,所以这个必须配置,如果不配置在app离线时会收不到离线消息),配置完成app离线时也可以收到推送消息啦

4 . 在app.vue页面onLaunch中添加

onLaunch: function() {
   var platform = uni.getSystemInfoSync().platform;
   // #ifdef APP-PLUS
   plus.screen.lockOrientation("portrait-primary");
   //推送
   var pinf = plus.push.getClientInfo();
   var cid = pinf.clientid; //客户端标识
   console.log('cid:' + cid);
   const _self = this;
   const _handlePush = function(payload) {
	 var pages = getCurrentPages();
	 console.log('----------', payload)
	 //页面栈为0,标记app是被push唤醒,在欢迎页执行跳转逻辑
	 if (payload.alive === false) {
		console.log('设置storage')
		uni.setStorage({
			key:'appLaunchedByPush',
			data:payload
		})
	 }
	 else { //app在线,收到push可以直接跳转
		uni.navigateTo({
			url: '/pages/index'
		});
	 }
   };
   plus.push.addEventListener('click', function(message) {
     console.log('push click =======', message)
     if (platform == 'ios') {
       //离线是payload为object , 在线时本地创建的为string(本地创建通知只能传string,否则无法传递payload)
       if (typeof message.payload == 'string') {
         console.log('string')
         var payload = JSON.parse(message.payload);
       } else {
         console.log('obj')
         var payload = message.payload;
       }
       _handlePush(payload);
	   return
     }
     //这里可以写跳转业务代码
     _handlePush(message.payload);
   });
   plus.push.addEventListener('receive', function(message) {
	 console.log('push receive ======', message);
     if (message.type == "receive"){ // 这里判断触发的来源,否则一直推送。  
       if (platform == 'ios') {
		 console.log('ios receive', message);
         if (typeof message.payload == 'string') {
           plus.push.createMessage(
             message.content,
             message.payload, {
             cover: false,
             title: message.title,
           });
         } else {
           plus.push.createMessage(
             message.content,
             JSON.stringify(message.payload), {
              cover: false,
              title: message.title,
           });
         } 
       }
	   else {
	     console.log('android receive======', message);
	     //执行跳转判断或添加本地通知
		 plus.push.createMessage(
           message.content, 
		   JSON.stringify(message.payload), {
		   cover: false,
		   title: message.title
		 });
	   }
     }
   });
 }

5 . 处理离线消息跳转在app默认跳转页面添加我这里是登录页面

uni.switchTab({
  url: '/pages/workplace/index',
  success: () => {
    //处理app被push唤醒时消息推送的跳转
    const payload = uni.getStorageSync('appLaunchedByPush')
    console.log('appLaunchedByPush', payload)
    if (payload) {		  
	  setTimeout(()=> {
	    console.log(payload + 'setTimeout')
	    uni.navigateTo({
		  url: '/pages/index'
	     });
	    uni.setStorage({
		  key:'appLaunchedByPush',
		  data:null
	    })
	  })  
    } 
  }
})

遇到的问题:

1 . 华为离线消息推送收不到?

(1)厂商推送是否配置完成,agconnect-services.json文件是否上传(2)打包或打自定义基座必须使用自有证书,共有证书收不到消息推送(3)华为手机会默认把离线消息归为营销通知,离线时消息是收到的只是不展示出来,在手机设置=》通知=》你的app=》打开营销通知选项才可以正常显示离线消息

2 . ios在线离线消息都收不到?

(1)是否申请ios证书(2)在开发者中心=》消息推送=》应用配置=》查看是否配置ios相关证书(3)打自定义基座时是否正确上传证书文件及私钥证书

3 . 离线消息收到了,但是不能正常跳转,点击后只能跳转到首页?

离线消息点击后会默认先跳转到首页或者欢迎页,这时在app.vue里写的跳转消息详情的页面也执行跳转,页面会报错提示不要重复跳转详情页。离线消息点击跳转到首页后,需要在app首页判断是否有离线消息,有的话再执行跳转消息详情页面。