一、配置
1、uni-push1.0文档
https://uniapp.dcloud.net.cn/unipush-v1.html
2、服务端推送文档
https://docs.getui.com/getui/server/rest_v2/push/
二、客户端
1、App.vue
import phoneInfo from '@/common/js/phone-info.js';
import uniPushListener from '@/common/js/unipush.js';
import updateApp from '@/common/js/update.js';
// #ifdef APP-PLUS
uniPushListener.getInfo();
plus.push.setAutoNotification(true); //设置通知栏显示通知 //必须设置
plus.screen.lockOrientation('portrait-primary'); //锁定屏幕方向
uni.setStorageSync('cancelUpdate', 'false'); // 进来APP 重置更新弹窗
// 获取App 当前版本号
if (Object.keys(uni.getStorageSync('widgetInfo')).length == 0) {
plus.runtime.getProperty(plus.runtime.appid, widgetInfo => {
phoneInfo.manifestInfo = widgetInfo;
uni.setStorageSync('widgetInfo', widgetInfo);
});
}
uniPushListener.getClientInfoLoop(); // 循环获取cid
uniPushListener.pushListener(); // 监听通知栏信息
plus.runtime.setBadgeNumber(0); //清除app角标
plus.runtime.setBadgeNumber(-1);
//检查版本更新
var platform = phoneInfo.systemInfo.platform;
var version = phoneInfo.systemInfo.appWgtVersion.toLowerCase();
var _this = this;
updateApp.checkUpdate(version, platform, function(res){
_this.$showModal({
title: '提示',
content: res.data.msg,
confirmText: '立即更新',
showCancel: false
}).then(ret => {
plus.runtime.openURL(res.data.path);
})
})
//#endif
2、phone-info.js
export default {
systemInfo: {}, // 系统设备信息
manifestInfo: "" || uni.getStorageSync("widgetInfo"), // manifest.json 应用信息
}
3、unipush.js
// 监听push消息 以及 后台数据回复
import phoneInfo from '@/common/js/phone-info.js';
let timer = null;
let numloop = 0;
import {
doRequest
} from "@/common/js/request.js"
// 消息推送 应用配置(这些给后端用的)
const uniPushObj = {
cid: "",
AppID: "",
AppKey: "",
AppSecret: "",
MasterSecret: "",
}
export default {
getInfo() {
uni.getSystemInfo({
success: res => {
phoneInfo.systemInfo = res;
}
});
},
// 开启监听推送
pushListener() {
const platform = phoneInfo.systemInfo.platform.toLowerCase();
// 点击推送信息
plus.push.addEventListener('click', res => {
const token = uni.getStorageSync("userid");
console.log("(click):" + JSON.stringify(res));
// 其实在这里就可以根据你自己的业务去写了
plus.push.clear(); //清空通知栏
if (token) {
messageClick(res);
} else {
// 这里跳登录页了
uni.navigateTo({
url: `/pages/login/index`
})
}
});
// 接收推送信息 在线
plus.push.addEventListener('receive', res => {
console.log("(receive):" + JSON.stringify(res));
const messageTitle = res.title;
const messageContent = res.content;
if (platform == 'android') {
/***
安卓监听不到 因为安卓这个格式被封装了,做成了通知栏展示
换个格式就行(比如里面多个字段,或换个字段名)
*/
/***
此格式的透传消息由 unipush 做了特殊处理, 会自动展示通知栏
开发者也可自定义其它格式, 在客户端自己处理
*/
// "push_message": {
// "transmission": "{
// title:\"标题\",
// content:\"内容\",
// payload:\"自定义数据\"
// }"
// },
// Hbulidx 版本大于 ## 3.4.18,安卓不再通知栏展示, 需要自行创建通知
plus.push.createMessage(messageContent, res.payload, {
title: messageTitle
});
// 或者在 onlaunch 写入
// plus.push.setAutoNotification(true);
} else {
const type = res.type
//【APP离线】收到消息,但没有提醒(发生在一次收到多个离线消息时,只有一个有提醒,但其他的没有提醒)
//【APP在线】收到消息,不会触发系统消息,需要创建本地消息,但不能重复创建
// 必须加msg.type验证去除死循环
if (res.aps == null && type == "receive") {
//创建本地消息,发送的本地消息也会被receive方法接收到,但没有type属性,且aps是null
plus.push.createMessage(messageContent, res.payload, {
title: messageTitle
});
}
}
});
function messageClick(msg) {
if (typeof(msg.payload) == 'string') { //如果是字符串,表示是ios创建的 要转换一下
msg.payload = JSON.parse(msg.payload)
}
if (!msg) return false;
try {
var page = msg.payload.page;
switch (msg.payload.type) {
case 'switchTab':
uni.switchTab({
url: page
})
break;
case 'navigateTo':
uni.navigateTo({
url: page
})
break;
case 'redirectTo':
uni.redirectTo({
url: page
})
break;
}
} catch (e) {
console.log(e)
}
}
},
// 循环获取clientid信息,直到获取到为止
getClientInfoLoop() {
plus.push.getClientInfoAsync(info => {
// 如果info不存在,或者info存在,cid不存在则再次获取cid
if (!info || !info.clientid) {
console.log("cid为空=========================================");
let infoTimer = null;
infoTimer = setInterval(function() {
if (cid) {
clearInterval(infoTimer); //清定时器
uni.showModal({
content: cid
})
uni.setStorageSync('cid', cid);
uniPushObj.cid = cid
}
}, 50);
} else if (info && info.clientid) {
let cid = info.clientid;
uni.setStorageSync('cid', cid);
uniPushObj.cid = cid
}
}, function(e) {
console.log('Failed', JSON.stringify(e));
let pinf = plus.push.getClientInfo();
let cid = pinf.clientid; //客户端标识
if (cid) {
uni.setStorageSync('cid', cid);
uniPushObj.cid = cid
}
})
},
/**
* 向后台传送cid,绑定别名
*/
passCid() {
var params = {
action: 'app_bind_cid',
appid: uniPushObj.AppID,
cid: uniPushObj.cid,
userid: uni.getStorageSync('userid')
};
console.log(params)
doRequest(params).then(response => {
console.log('----------> cid 绑定别名成功', response);
})
},
}
4、update.js
import {
doRequest
} from "@/common/js/request.js"
export default {
//获取已登陆用户信息
checkUpdate(version, platform, callback=function(){}) {
doRequest({
action: 'app_version',
version: version,
platform: platform
}).then(res => {
if (res.code == 0) {
callback(res)
}
})
}
}
三、服务端示例
//0:站内信,1:消息
$type = isset($type) ? $type : 0;
$clickType = 'intent';
$payload = array('type' => 'switchTab', 'page' => $type == 1 ? '/pages/chat/index' : '/pages/message/index');
$url = "";
$data = array(
'cid' => $cid,
'title' => $title,
'content' => $content,
'clickType' => $clickType,
'payload_data' => json_encode($payload),
'url' => $url,
'intent_data' => "intent://io.dcloud.unipush/?#Intent;scheme=unipush;launchFlags=0x4000000;component=包名/io.dcloud.PandoraEntry;S.UP-OL-SU=true;S.title=".urlencode($title).";S.content=".urlencode($content).";S.payload=".json_encode($payload).";end"
);
//记录推送数据
write_log(json_encode($data, JSON_UNESCAPED_UNICODE));
pushToSingleByCid($data);
/**
* 发送透传消息
* @param $data
* @return bool
*/
function pushToSingleByCid($data){
//创建API,APPID等配置参考 环境要求 进行获取
$api = new GTClient(URL,APPKEY, APPID,MS);
$setting = new GTSettings();
$setting->setTtl(3600000);
//设置推送参数
$push = new GTPushRequest();
$push->setRequestId(time());
$message = new GTPushMessage();
$notify = new GTNotification();
$pushChannel = new GTPushChannel();
//配置推送条件
$push->setSettings($setting);
//设置个推
$notify->setTitle($data['title']);
$notify->setBody($data['content']);
$notify->setChannelLevel(3);
//点击通知后续动作,目前支持以下后续动作:
//1、intent:打开应用内特定页面url:打开网页地址。2、payload:自定义消息内容启动应用。3、payload_custom:自定义消息内容不启动应用。4、startapp:打开应用首页。5、none:纯通知,无后续动作
$notify->setClickType($data['clickType']);
if ($data['clickType'] == 'payload') {
$notify->setPayload($data['payload_data']);
}
if ($data['clickType'] == 'url') {
$notify->setUrl($data['url']);
}
if ($data['clickType'] == 'intent') {
$notify->setIntent($data['intent_data']);
}
$message->setNotification($notify);
$push->setPushMessage($message);
//设置安卓离线厂商通道推送消息体
$androidDTO = new GTAndroid();
$ups = new GTUps();
//消息分类配置
$ups->addOption("VV", "/category", "SUBSCRIPTION");
$ups->addOption("XM", "/extra.channel_id", "通道id");
$ups->addOption("OP", "/channel_id", "通道id");
$notification1 = new GTThirdNotification();
$notification1->setTitle($data['title']);
$notification1->setBody($data['content']);
$notification1->setClickType($data['clickType']);
if ($data['clickType'] == 'payload') {
$notification1->setPayload($data['payload_data']);
}
if ($data['clickType'] == 'url') {
$notification1->setUrl($data['url']);
}
if ($data['clickType'] == 'intent') {
$notification1->setIntent($data['intent_data']);
}
$ups->setNotification($notification1);
$androidDTO->setUps($ups);
$pushChannel->setAndroid($androidDTO);
$push->setPushChannel($pushChannel);
//推送苹果离线通知标题内容
$alert = new GTAlert();
$alert->setTitle($data['title']);
$alert->setBody($data['content']);
$aps = new GTAps();
//1表示静默推送(无通知栏消息),静默推送时不需要填写其他参数。
//苹果建议1小时最多推送3条静默消息
$aps->setContentAvailable(0);
$aps->setSound("default");
$aps->setAlert($alert);
$iosDto = new GTIos();
$iosDto->setAps($aps);
$iosDto->setType("notify");
$iosDto->setAutoBadge(1);
$pushChannel = new GTPushChannel();
$pushChannel->setIos($iosDto);
$push->setCid($data['cid']);
//处理返回结果
$result = $api->pushApi()->pushToSingleByCid($push);
write_log(json_encode($result, JSON_UNESCAPED_UNICODE));
write_log('----');
var_dump($result);
//
if ($result['code'] == 0) {
return true;
}
return false;
}