【uni-app】一文看懂uni-push个推的使用

前言

​ 一些技术或者功能的使用,经常是需要翻阅多个文档才能得到想要的答案。故整理成文档,一条线下来从基础概念到简单使用,方便有需要的人查阅。

​ 首先会展示 目标(效果) 来让你了解该篇内容要达到什么样的使用情况,其次会告诉你通过什么样的过程达到该 目标 ,最后会整理过程中遇到的 常见问题 及解决方法,也欢迎各位能把遇到的问题和解决方案私信让我补充上去,感谢!

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

  1. 手机启动APP
  2. 获取手机cid标识
  3. 登录成功后将cid发送给服务端
  4. 服务端保存cid并与用户关联

2)服务端推送消息

  1. 服务端根据业务找到需要推消息的用户
  2. 将消息以透传或通知消息发出
  3. 客户端收到提示

3)客户端接收消息(以透传消息为例)

  1. 客户端弹出消息
  2. 点击消息
  3. 拉起APP
  4. 根据透传逻辑处理(正常是打开某个对应的页面)

2. 目标(本文仅以安卓为例)

我们本次个推要达成的目标是:

能够通过 uniPush开发者中心 uniPush官方网站的个推服务,向手机发送推送,如下两图所示:
uniPush向手机发送推送
手机接收到推送

3. 过程

3.1 开通 unipush

开通uniPush的官方指南

如上文章介绍十分详细,因此只提几点在开通过程中遇到的问题:

1)开通个推时,包名、数字签名如何填写?
在这里插入图片描述

  1. 包名

    打开 HbuilderX - 菜单栏的"发行" - 原生APP云打包 - Android 包名,复制该包名即可

  2. 数字签名

    使用 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)解决办法

服务端调用所要用到的AppIDAppKey 等应用配置信息应该使用 unipush开发者中心 中的,而非个推网站中注册的应用信息,如下图所示
在这里插入图片描述

4.5 为什么收不到消息的离线推送?

注意!! 只有打了正式包才可以收到离线推送,打自定义基座不行(华为是可以在自定义基座的情况下实现离线推送的)

  • 10
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值