uniapp 使用unipush开发消息推送客户端代码分享

339 阅读2分钟
  1. 获取clientId(设备id),获取到了之后需要传给服务端,服务端会根据这个id给该id对应的设备推送消息。实践中发现clientId有时获取为空,所以通过setInterval去轮询获取了一下,保证clientId不为空。
let pinf = plus.push.getClientInfo();
    if (pinf && pinf.clientid) {
      console.log('aaaaaa',pinf.clientid)
      _self.clientId=pinf.clientid
      setClientId(pinf.clientid)
    }
    else {
      var obtainingCIDTimer = setInterval(function() {
        pinf = plus.push.getClientInfo();
        if (pinf.clientid) {
          _self.clientId=pinf.clientid
          setClientId(pinf.clientid)
          clearInterval(obtainingCIDTimer);
        }
      }, 50);
    }
    setTimeout(() => {
      _self.clientId && setClientId(_self.clientId)
    }, 500);

2.当我们进入了app时,这时候服务端推送了消息过来,即在线推送消息时需要客户端手动调用plus.push.createMessage去创建消息的状态栏。

 // 在线推送消息
    plus.push.addEventListener(
    'receive',
    function (msg) {
      console.log('tmdtmdtmd',msg)
      const {content,type,title,payload}=msg || {}
      const newPayload=JSON.parse(payload) || {}
      const {data}=newPayload
    //ios平台需要多一层判断,且拿取方式不同
      var platform = uni.getSystemInfoSync().platform
      if (platform == 'ios') {
        if (type == 'receive') {
          // 这里判断触发的来源,否则一直推送。
          let options = { cover: false, title }
          plus.push.createMessage(content, msg.payload, options)
        }
      } else if (platform == 'android') {
        let option = { cover: false, title }
        plus.push.createMessage(msg.content, msg.payload, option)
      }
    },
    false
  )

3.处理点击消息的业务

 plus.push.addEventListener('click', async function(message) {
      console.log('哈哈哈哈哈哈',message)
      let commonBusType=null,commonData=null
      var platform = uni.getSystemInfoSync().platform
      if(platform == 'ios'){
        if(message.aps){
          const {busType,data}=message.payload || {}
          commonBusType=busType;
          commonData=data
          setMessageInfo(message.payload)
        }else {
          const payload=JSON.parse(message.payload) || {}
          const {busType,data}=payload
          commonBusType=busType;
          commonData=data
          setMessageInfo(payload)
        }
      }else if (platform == 'android'){
        const {busType,data}=message.payload || {}
          commonBusType=busType;
          commonData=data
          setMessageInfo(message.payload)
      }

      console.log('这是通知类型1111',commonBusType)
      console.log('这是通知消息',commonData)
      //此处是具体的业务代码
      }, 1000)
    }, false);

4.APP图标右上角消息数量展示逻辑处理代码

// 获取ios角标数量
function getIosBadgeNum(){
    // #ifdef APP-PLUS 
    var UIApplication = plus.ios.import("UIApplication");
    var app = UIApplication.sharedApplication();
    var currentBadge = app.applicationIconBadgeNumber();
    console.log('当前角标值:', currentBadge);
    plus.ios.deleteObject(app); // 释放对象
    return currentBadge
     // #endif 
}
function clearBadge(muinNum=1){
    // #ifdef APP-PLUS 
    var platform = uni.getSystemInfoSync().platform;
    console.log('测试角标数量222',getIosBadgeNum())
    if(platform == 'ios'){
        console.log('测试角标数量111111',getIosBadgeNum())
        const num=getIosBadgeNum()
        const currentNum=num<=0 ? 0 :num-muinNum
        plus.runtime.setBadgeNumber(currentNum);
        var GeTuiSdk = plus.ios.importClass('GeTuiSdk');
        GeTuiSdk.setBadge(currentNum); // 同步个推角标数值
        plus.ios.import("UIApplication").sharedApplication().setApplicationIconBadgeNumber(currentNum); // 系统级清除
    }else{
        plus.push.clear();
        plus.runtime.setBadgeNumber(-1);
        plus.runtime.setBadgeNumber(0);
        var GeTuiSdk = plus.android.importClass('com.getui.api.GTIntentService');
        GeTuiSdk.setBadge(-1);
        GeTuiSdk.setBadge(0);
    }
     // #endif 
}

5.在app应用中打开手机允许通知设置页面,getPermissionStatus方法是获取手机系统设置允许通知是开启还是关闭状态,setPermissions方法是打开手机允许通知设置页面。

function setPermissions(){
    // #ifdef APP-PLUS  
	if (plus.os.name == 'Android') { // 判断是Android
		var main = plus.android.runtimeMainActivity();
		var pkName = main.getPackageName();
		var uid = main.getApplicationInfo().plusGetAttribute("uid");
        openAndroidPermissionDialog(main,pkName,uid)
	} else if (plus.os.name == 'iOS') { // 判断是ISO
		var UIApplication = plus.ios.import("UIApplication");
        openIosPermissionDialog(UIApplication)
	}
	// #endif  
}
function openAndroidPermissionDialog(main,pkName,uid){
    var Intent = plus.android.importClass('android.content.Intent');
    var Build = plus.android.importClass("android.os.Build");
    //android 8.0引导  
    if (Build.VERSION.SDK_INT >= 26) {
        var intent = new Intent('android.settings.APP_NOTIFICATION_SETTINGS');
        intent.putExtra('android.provider.extra.APP_PACKAGE', pkName);
    } else if (Build.VERSION.SDK_INT >= 21) { //android 5.0-7.0  
        var intent = new Intent('android.settings.APP_NOTIFICATION_SETTINGS');
        intent.putExtra("app_package", pkName);
        intent.putExtra("app_uid", uid);
    } else { //(<21)其他--跳转到该应用管理的详情页  
        var Settings = plus.android.importClass("android.provider.Settings");
        var Uri = plus.android.importClass("android.net.Uri");
        var intent = new Intent();
        intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        var uri = Uri.fromParts("package", pkName, null);
        intent.setData(uri);
    }
    // 跳转到该应用的系统通知设置页  
    main.startActivity(intent);
}
function openIosPermissionDialog(UIApplication){
    var NSURL2 = plus.ios.import("NSURL");
    var setting2 = NSURL2.URLWithString("app-settings:");
    var application2 = UIApplication.sharedApplication();
    application2.openURL(setting2);
    plus.ios.deleteObject(setting2);
    plus.ios.deleteObject(NSURL2);
    plus.ios.deleteObject(application2);
}
function getPermissionStatus(){
 // #ifdef APP-PLUS 
    if(plus.os.name == 'Android'){
        var main = plus.android.runtimeMainActivity();
        var NotificationManagerCompat = plus.android.importClass("android.support.v4.app.NotificationManagerCompat");
        //android.support.v4升级为androidx
        if (NotificationManagerCompat == null) {
            NotificationManagerCompat = plus.android.importClass("androidx.core.app.NotificationManagerCompat");
        }
        var areNotificationsEnabled = NotificationManagerCompat.from(main).areNotificationsEnabled();
        return areNotificationsEnabled
    }else if (plus.os.name == 'iOS') {
        var UIApplication = plus.ios.import("UIApplication");
        var app = UIApplication.sharedApplication();
        var enabledTypes = 0;
        if (app.currentUserNotificationSettings) {
            var settings = app.currentUserNotificationSettings();
            enabledTypes = settings.plusGetAttribute("types");
            if(enabledTypes==0){
                return false
            }
            return true
        }
    }
    // #endif 
}