今天在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":"十一位的时间戳"
}
然后你手机就会收到在线消息
要做离线的消息请看我的另一篇博客