前言
一些技术或者功能的使用,经常是需要翻阅多个文档才能得到想要的答案。故整理成文档,一条线下来从基础概念到简单使用,方便有需要的人查阅。
首先会展示 目标(效果)
来让你了解该篇内容要达到什么样的使用情况,其次会告诉你通过什么样的过程达到该 目标
,最后会整理过程中遇到的 常见问题
及解决方法,也欢迎各位能把遇到的问题和解决方案私信让我补充上去,感谢!
1. 基础概念(必须了解,已了解的可直接跳过)
1.1 什么是消息推送?
如同微信收到未读消息后会在通知栏显示,该条消息便是微信APP的消息推送。多用于有需要从服务端主动发出消息提醒到客户端的场景。
1.2 uniPush & 个推 & 厂商推送
个推 | unipush | 厂商推送 | |
---|---|---|---|
简介 | 个推提供移动端消息推送服务 | uniapp集成了个推的各个功能,更好地与uniapp结合 | 各个厂商上也有自己的推送,比如华为、小米,相当于使用厂商自带的推送服务 |
特点 | 需要收费 | 相当于收费版的个推免费给开发uniapp的人使用 | 免费,但有的厂商有使用条件,比如vivo需要上架应用市场后才可开通 |
当APP在线时,走个推通道;APP离线时,走厂商推送。
结论
当我们使用 uni-app
开发应用时,使用 uni-push
是最方便的,如下:
- unipush 拥有个推的收费功能
- 集成了个推和厂商推送两种推送方式,会自动根据判定APP是否在线,来决定采用哪种方式推送,以保证推送消息的送达率。
- 尽管使用 unipush,但服务端需使用的文档参考,仍然是个推官网的文档。
1.3 通知消息 & 透传消息
1)通知消息
官方 封装
了消息模板、以及客户端点击消息后的事件,若只需要简单地发出消息推送,不处理复杂的点击后的逻辑,使用通知消息即可。
2)透传消息
完全 可自定义
模板及点击消息后事件的消息,若需要处理自定义的点击后的逻辑,使用透传消息更佳。
1.4 个推流程
以cid个推方式为例
1)注册cid
- 手机启动APP
- 获取手机cid标识
- 登录成功后将cid发送给服务端
- 服务端保存cid并与用户关联
2)服务端推送消息
- 服务端根据业务找到需要推消息的用户
- 将消息以透传或通知消息发出
- 客户端收到提示
3)客户端接收消息(以透传消息为例)
- 客户端弹出消息
- 点击消息
- 拉起APP
- 根据透传逻辑处理(正常是打开某个对应的页面)
2. 目标(本文仅以安卓为例)
我们本次个推要达成的目标是:
能够通过 uniPush开发者中心 uniPush官方网站的个推服务,向手机发送推送,如下两图所示:
3. 过程
3.1 开通 unipush
如上文章介绍十分详细,因此只提几点在开通过程中遇到的问题:
1)开通个推时,包名、数字签名如何填写?
-
包名
打开
HbuilderX
- 菜单栏的"发行" - 原生APP云打包 - Android 包名,复制该包名即可 -
数字签名
使用
keytool
生成并查看自有证书的数字签名:生成数字签名详细方法① 在本机安装
jdk1.8
的环境② 使用
keytool -genkey
命令生成证书testalias
是证书别名test.keystore
是证书文件名称keytool -genkey -alias testalias -keyalg RSA -keysize 2048 -validity 36500 -keystore test.keystore
示例:
keytool -genkey -alias ykkey -keyalg RSA -keysize 2048 -validity 36500 -keystore yk.keystore
③ 查看密钥信息
SHA1 即为数字签名,复制即可
keytool -list -v -keystore test.keystore # 输入以上命令之后,会展示如下信息 MD5: 0D:FD:B8:12:FB:7A:BB:xx... SHA1: AE:71:96:33:F6:09:59:AD:xx... SHA256: 88:63:8A:94:12:3B:6B:E9:55:25:FF:6E:FA:xx...
2)生成私有签名证书时,keytool 错误: java.io.FileNotFoundException: xxx.keystore (拒绝访问。)
① 原因
JDK安装在C盘,没有写的权限,因此报错
② 解决方法
将证书的目录更改,示例如下:
C:\Program Files\Java\jdk1.7.0_65\bin>keytool -genkey -alias andro
eyalg RSA -validity 30000 -keystore D:/keyStore/android.keystore
3.2 注册厂商推送
上一步开通了 uniPush 之后,便可以配置厂商推送设置,用于接收离线消息用,如下图,可打开对应厂家的开发者后台,通用注册步骤如下:
1)打开对应厂商开发者后台
2)注册开发者账号(大部分需要上传个人身份证及真人照,特殊的只能注册企业账号,需要企业的营业执照等资料)
3)提交审核
4)审核通过后,可进入开发者后台查看对应 App 的 AppID、AppKey 等内容,复制并填写到 uniPush
的厂商推送设置中
3.3 配置手机权限
在 uniApp
项目中,进入 manifest.json
源代码视图,如下权限是必须配置的手机权限,来保证个推消息推送的成功率
(1)网络连接(必选)
<uses-permission android:name="android.permission.INTERNET”/>
(2)获取手机状态参数,并作为生成个推唯一标识的必要参数(必选)
<uses-permission android:name="android.permission.READ_PHONE_STATE”/>
(3)查看网络状态,sdk重连机制等需要使用(必选)
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE”/>
(4)查看wifi连接状态(必选)
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE”/>
(5)开机自启动权限,提升sdk活跃,保障触达(必选)
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED”/>
(6)写sd卡权限,做数据备份(必选)
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE”/>
(7)震动权限(使用通知功能必选)
<uses-permission android:name="android.permission.VIBRATE”/>
(8)获取任务信息,目的是防止sdk被频繁唤醒(必选)
<uses-permission android:name="android.permission.GET_TASKS”/>
3.4 前端处理逻辑
前端处理中,分为两部分:获取cid 和 点击推送消息后的逻辑
1)获取cid
注意
需要使用条件编译,避免H5上运行时报错
cid
也就是手机标识,用来唯一标识是哪台手机的
getCID
方法可以放在登录逻辑中,将获取到的 cid
放在登录接口中,让后端将用户与 cid 绑定并存起来。
// 获取客户端标识
getCID() {
let cid = ''
// #ifdef APP-PLUS
let pinf = plus.push.getClientInfo();
cid = pinf.clientid;
// #endif
return cid
}
2)点击推送消息后的逻辑
以点击消息后,进入到 home
页面为例, 在 APP.vue
中编写如下逻辑
先重定向到首页,再跳转到特定的页面,符合日常使用逻辑;若直接跳转到特定页面,用户一旦点击返回,由于页面栈中没有其他页面,便容易出现预料之外的错误。
<script>
export default {
created() {
// #ifdef APP-PLUS
// 添加监听从系统消息中心点击某条消息启动应用事件
plus.push.addEventListener("click", msg => {
// 分析msg.payload处理业务逻辑
if (!msg.payload) {
return
}
this.handlePush(msg)
}, false); // false: 在冒泡阶段执行;true: 在捕获阶段执行
// #endif
},
methods: {
// 处理点击推送消息后的事件
handlePush(msg) {
uni.reLaunch({
// 1.先重定向到首页
url: '../navigation/index',
success: () => {
uni.navigateTo({
// 2.跳转到消息推送指定单据,payload格式:../home/index
url: msg.payload
});
}
})
},
}
}
</script>
3.5 发送cid个推测试
1)进入 uniPush
开发者中心
2)选择透传消息,填写描述、透传内容、目标用户等,以点击消息后要跳转到 home
页面为例,如下图所示
解析
Intent 数据格式:
其中io.dcloud.HBuilder为APP包名,需要替换为自己APP的包名;
S.title=的值为推送消息标题,对应5+ API中PushMessage对象的title属性值;
S.content=的值为推送消息内容,对应5+ API中PushMessage对象的content属性值;
S.payload=的值为推送消息的数据,对应5+ API中PushMessage对象的payload属性值;
launchFlags=0x14000000字段,解决接收多条通知后点击可能无法触发click事件的问题
3)点击预览
4)点击确认来发送透传消息,即可在手机端上查看到开头所说的消息推送
4. 常见问题
4.1 注册华为厂商通道注意事项
1)需要上线在华为市场下载【实测不一定需要】
2)需要华为手机安装华为移动服务
3)华为推送的 SHA256
码未配置:华为推送平台-项目设置-常规-应用,将前面我们 keytool
生成的 SHA256
复制进去即可
4.2 个推是否会有次数限制?
就目前所知,vivo 一个设备一天只能收到5条离线消息,其他推测是没有次数限制。
4.3 keytool 申请 Android 应用签名时报错提示拒绝访问
见 3.1 ,问题2
4.4 服务端调用个推接口时,报错20001参数不合法
1)解决办法
服务端调用所要用到的AppID
、AppKey
等应用配置信息应该使用 unipush开发者中心
中的,而非个推网站中注册的应用信息,如下图所示
4.5 为什么收不到消息的离线推送?
注意!!
只有打了正式包才可以收到离线推送,打自定义基座不行(华为是可以在自定义基座的情况下实现离线推送的)