unipush2.0 (云函数) APP推送 第一篇

本文详细描述了如何在小程序中启用push功能,包括创建云函数、配置阿里云服务器、发送消息以及确保用户接收消息的通知权限。作者分享了具体的代码示例和注意事项。
摘要由CSDN通过智能技术生成

今天在app上做了一个推送功能,查了大量资料才完成。在查资料的路上费了很长时间。所以下面我把写这个功能能遇到的所有流程都写下来。

一、开启push功能

二、创建云函数

在要进行下一步之前,我要说一下虽然unipush2支持小程序推送,但是没人这样做,小程序的消息推送是订阅消息,这个比unipush简单的很多

要用unipush必须买服务器,你可以买阿里云的服务器(因为可以有一个月的免费试用)

你点进去选择阿里云的就行

这个免费的不需要你创建三张表但正式的需要把这三张表创建好

创好以后我们就上代码环节了

在你的项目里绑上刚才买的服务器(右键选择创建uniCloud,选择阿里云)

右键cloudfunctions新建云函数

然后点确定

接着就把我的代码直接复制进去

'use strict';
const uniPush = uniCloud.getPushManager({
  appId: "你自己的appid"
})
exports.main = async (event) => {
  let obj = JSON.parse(event.body)
  console.log(obj);
  const res = await uniPush.sendMessage({
    "push_clientid": obj.cids, // 设备id,支持多个以数组的形式指定多个设备,如["cid-1","cid-2"],数组长度不大于1000  
    "title": obj.title, // 标题  
    "content": obj.content, // 内容  
    "payload": obj.data, // 数据  
    "force_notification": true, // 服务端推送 需要加这一句  
    "request_id": obj.request_id, //请求唯一标识号,10-32位之间;如果request_id重复,会导致消息丢失   
    "options": obj.options 
  })
  return res //一定要return回去
};

一定一定记得把appid换成你自己的

然后上传云函数  (在你云函数的文件夹上右键选择上传云函数)

上传了以后就可以在服务空间看到你的云函数了  点击详情

配置你的云函数名字(这个云函数后面会讲怎么用)

这样云函数部分就写完了

三、接收消息

APP接受消息你得先让用户开启消息通知  这是检查用户消息权限

 checkPush() {
        // #ifdef APP-PLUS  
        let self = this
        if (plus.os.name == 'Android') { // 判断是Android
          var main = plus.android.runtimeMainActivity();
          var pkName = main.getPackageName();
          var uid = main.getApplicationInfo().plusGetAttribute("uid");
          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();
          // 未开通‘允许通知’权限,则弹窗提醒开通,并点击确认后,跳转到系统设置页面进行设置
          console.log(areNotificationsEnabled);
          if (!areNotificationsEnabled) {
            uni.showModal({
              title: '通知权限开启提醒',
              content: '您还没有开启通知权限,无法接受到充电完成、故障等重要消息通知,请前往设置!',
              confirmText: '去设置',
              showCancel: true, //是否显示取消按钮,默认为true
              cancelText: '取消', //取消按钮的文字
              success: function(res) {
                if (res.confirm) {
                  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)其他--跳转到该应用管理的详情页  
                    intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                    var uri = Uri.fromParts("package", mainActivity.getPackageName(), null);
                    intent.setData(uri);
                  }
                  // 跳转到该应用的系统通知设置页  
                  main.startActivity(intent);
                } else if (res.cancel) { //点击取消之后执行的代码
                  console.log('用户点击取消')
                 //这里执行你的业务
                }
              }
            });
          } else {
            //这里执行你的业务
          }
        } else if (plus.os.name == 'iOS') { // 判断是ISO
          var isOn = undefined;
          var types = 0;
          var app = plus.ios.invoke('UIApplication', 'sharedApplication');
          var settings = plus.ios.invoke(app, 'currentUserNotificationSettings');
          if (settings) {
            types = settings.plusGetAttribute('types');
            plus.ios.deleteObject(settings);
          } else {
            types = plus.ios.invoke(app, 'enabledRemoteNotificationTypes');
          }
          plus.ios.deleteObject(app);
          isOn = (0 != types);
          if (isOn == false) {
            uni.showModal({
              title: '通知权限开启提醒',
              content: '您还没有开启通知权限,无法接受到消息通知,请前往设置!',
              showCancel: true, //是否显示取消按钮,默认为true
              cancelText: '取消', //取消按钮的文字
              confirmText: '去设置',
              success: function(res) {
                if (res.confirm) {
                  var app = plus.ios.invoke('UIApplication', 'sharedApplication');
                  var setting = plus.ios.invoke('NSURL', 'URLWithString:', 'app-settings:');
                  plus.ios.invoke(app, 'openURL:', setting);
                  plus.ios.deleteObject(setting);
                  plus.ios.deleteObject(app);
                } else if (res.cancel) { //点击取消之后执行的代码
                  console.log('用户点击取消')
                 //这里执行你的业务
                }
              }
            });
          } else {
            //这里执行你的业务
          }
        }
        // #endif
      },

小程序消息订阅可以看我另一篇博客

接着在app.js文件  onlaunch中写

uni.getPushClientId({
        success: (res) => {
          let push_clientid = res.cid;
          console.log('客户端推送标识cid:', push_clientid);
        },
        fail(err) {
          console.log(err);
        }

      })

 //#ifdef APP-PLUS
      var info = plus.push.getClientInfo()
      // 使用5+App的方式进行监听消息推送
      plus.push.addEventListener("click", function(msg) {
        console.log("click:" + JSON.stringify(msg));
        console.log(msg.payload);
        console.log(JSON.stringify(msg));
        // onLaunch 生命周期里,页面跳转有问题,跳不过去
        // 应该是页面还没加载,加上定时后,就可以了;
        setTimeout(() => {
          // uni.navigateTo({
          //   url: `packageA/pages/order-detail/order-detail?orderId=${msg.payload.orderId}`
          // })
        }, 1000)
      }, false);
      // 监听在线消息事件    
      plus.push.addEventListener("receive", function(msg) {
        //业务代码
        console.log("recevice:" + JSON.stringify(msg))
        if ("LocalMSG" == msg.payload) {} else {
          if (msg.type == 'receive') {
            var options = {
              cover: false,
              title: msg.title
            };
            plus.push.createMessage(msg.content, msg.payload, options);
          }
        }

      }, false);
      //#endif

这个cid就是用户的cid然后保存起来发给后端

然后你自己怎么调用呢

用postman把链接写上post请求

{  
    "cids":"你获取到的cid",  
    "title":"111",  
    "content":"111 ",  
    "data":{  
        "data1":1,  
        "data2":2  
    },  
//这个options是离线通知需要配置不同的厂商
    "options":{
"VV":{
    "/category":"ORDER"   
},
"HW": {
            "/message/android/category": "EXPRESS"
        },
         "XM": {
          "/extra.channel_id": "你自己的申请的"
        }
    },
    "request_id":"十一位的时间戳"  
}

然后你手机就会收到在线消息

要做离线的消息请看我的另一篇博客

  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
好的,以下是一些主流厂商推送通道的参数配置示例: ### 小米推送 ```json { "provider": "xiaomi", "payload": { "registration_id": "yourDeviceRegId", "restricted_package_name": "yourPackageName", "pass_through": 0, // 穿透消息:0-通知栏消息,1-透传消息 "notify_type": -1, // 通知类型:-1-默认通知,1-静默通知,2-默认声音,3-自定义声音,4-振动,5-呼吸灯 "title": "Push Title", // 通知栏消息标题 "description": "Push Content", // 通知栏消息正文 "payload": "yourPayload", // 透传消息内容 "extra": { "key1": "value1", // 自定义参数 "key2": "value2" }, "notify_id": 0, // 通知ID "time_to_live": 86400, // 离线消息保留时长(秒) "timeToSend": 0, // 定时推送时间(秒),0表示立即推送 "notify_foreground": 1 // 是否在前台展示通知:0-不展示,1-展示 }, "config": { "appSecret": "yourAppSecret" // 应用秘钥 } } ``` 需要注意的是,小米推送需要在官网上注册并创建应用,获取到应用秘钥和设备注册ID。 ### 华为推送 ```json { "provider": "huawei", "payload": { "hps": { "msg": { "type": 3, // 消息类型:1-透传异步消息,3-通知栏消息 "body": { "title": "Push Title", // 通知栏消息标题 "content": "Push Content", // 通知栏消息正文 "badge": 1, // 角标 "sound": "default", // 声音 "click_action": { "type": 1, // 点击通知后的行为:1-打开APP首页,2-打开自定义页面,3-打开URL "intent": "#Intent;compo=com.rvr/.Activity;S.W=U;end" }, "extras": { "key1": "value1", // 自定义参数 "key2": "value2" } } } }, "token_list": [ "yourDeviceToken" ] }, "config": { "appId": "yourAppId", // 应用ID "appSecret": "yourAppSecret" // 应用秘钥 } } ``` 需要注意的是,华为推送需要在官网上注册并创建应用,获取到应用ID和应用秘钥。 ### 魅族推送 ```json { "provider": "meizu", "payload": { "registration_ids": [ "yourDeviceRegId" ], "title": "Push Title", // 通知栏消息标题 "content": "Push Content", // 通知栏消息正文 "ticker": "Push Ticker", // 通知栏消息滚动文字 "is_multiple": 0, // 是否多包名推送:0-否,1-是 "click_type": 0, // 点击通知栏后的行为:0-打开应用,1-打开URL,2-自定义行为 "click_activity": "yourActivity", // 点击通知栏后打开的Activity "click_url": "yourUrl", // 点击通知栏后打开的URL "custom_content": { "key1": "value1", // 自定义参数 "key2": "value2" }, "off_line": true, // 是否离线推送 "valid_time": 432000, // 离线消息保留时长(秒) "push_time": "2022-01-01 00:00:00" // 定时推送时间 }, "config": { "appId": "yourAppId", // 应用ID "appSecret": "yourAppSecret" // 应用秘钥 } } ``` 需要注意的是,魅族推送需要在官网上注册并创建应用,获取到应用ID和应用秘钥。 ### vivo推送 ```json { "provider": "vivo", "payload": { "reg_id": "yourDeviceRegId", "notify_type": 4, // 通知类型:1-默认,2-静音,3-振动,4-声音,5-呼吸灯 "title": "Push Title", // 通知栏消息标题 "content": "Push Content", // 通知栏消息正文 "skip_type": 2, // 点击通知栏后的行为:1-打开应用,2-打开URL,3-自定义行为 "skip_content": "yourUrl", // 点击通知栏后打开的URL "network_type": -1, // 网络类型:-1-任意网络,1-仅WIFI "client_custom_map": { "key1": "value1", // 自定义参数 "key2": "value2" }, "request_id": "yourReqId", // 请求ID,必须唯一 "time_to_live": 86400, // 离线消息保留时长(秒) "time_for_off_line": 86400, // 离线消息转为在线消息的时长(秒) "target_type": 1, // 推送范围:1-指定RegId,2-所有设备 "push_mode": 0 // 推送模式:0-正式,1-测试(仅发送给测试设备) }, "config": { "appId": "yourAppId", // 应用ID "appKey": "yourAppKey", // 应用秘钥 "appSecret": "yourAppSecret" // 应用秘钥 } } ``` 需要注意的是,vivo推送需要在官网上注册并创建应用,获取到应用ID、应用秘钥和应用秘钥。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值