什么是 push
push,指服务器主动向客户端发送消息的技术。无需客户端持续轮询服务器,即可获得即时数据。
push 的方式
-
在线推送
客户端激活时,默认通过 socket 协议实现 push(透传消息),此时消息不会出现在通知栏,可自行在应用内手动创建通知栏消息。
也可以在服务器端强制指定用厂商通道发送 通知消息,此时同离线推送。 -
离线推送
客户端未激活时,调用手机厂商提供的接口,通过不会离线的手机厂商通道,向手机操作系统推送消息(通知消息)。用户通过通知栏消息唤起应用后,应用才能收到消息。
因此,离线推送功能需先向各个rom厂商申请开通推送服务
不同厂商对通道的调用有不同的要求,如OPPO需要该APP启动过,且设备在30天内有联网行为。此外,通知栏权限默认不开启,如OPPO需要自行引导用户开启通知栏权限。 -
小程序
本质上也是利用了APP的在线推送 / 离线推送 -
浏览器 webnotification
浏览器厂商没有提供 push 通道,只是开发者通过轮询或WS自行实现的消息通知
uni push
uni-app 提供了 uni push 服务,这是一个包括客户端和服务器的统一服务,整合了苹果APNs、华为、小米、OPPO、VIVO、魅族、谷歌FCM等多家厂商的系统推送和个推的独立推送,一套代码多端推送。
- uni push免费接入了个推原本需要收费的vip push,以支持APP在线推送,其本质就是使用dcloud账号的个推vip push,无法再进一步提升送达率
- uni push 2.0将流程集成到了uniCloud,简化了操作,以下均以2.0为例
真机调试时
涉及到第三方 SDK 的配置,需要打包自定义基座进行测试
离线推送不支持真机调试,仅可在正式版使用
打包时
如果是云打包,首先勾选权限配置,manifest.json->App 模块权限配置->Push。然后,manifest.json->App SDK 配置->推送,按照提示申请相应平台的信息,并填写。最后,勾选并填写完成后再进行打包即可。如果是离线打包,自行在原生工程中配置SDK,并确保选择了推送模块。
极光
极光分为通知和消息。
通知就是当程序在后台运行时,导航条出现的那一条推送。
消息是不通过推送直接推送到用户app中。
个推
个推不同于极光,把通知和消息放到一起了。当我们程序处于后台时候。服务器发送透传信息的时候会以通知的形式送达手机端。当我们点击通知打开程序后传达的消息又会以透传的方式送达app中。
也可以通过参数配置改为和极光一样的模式
各手机厂商开通推送服务
unipush 官方文档 未提及消息推送需申请开通,且部分配置已落后,详见下方说明:
OPPO
OPPO开放平台-应用服务-移动服务-推送服务-申请开通消息推送
开通后将应用的AppID、AppKey、AppSecret、AppServerSecret(即MasterSecret)填入UniPush的厂商推送设置
小米
小米开放平台-应用服务-消息推送-启用推送(选择需要开启推送的应用)
开通后将应用的AppID、AppKey、AppSecret 填入UniPush的厂商推送设置
VIVO
VIVO开放平台-应用-消息推送-开通
华为
华为开放平台-我的项目-项目设置-API管理(开启推送)-常规
开通后将应用的AppID、Client Secret 、agconnect-services.json 填入UniPush的厂商推送设置
IOS(https://developer.apple.com)
确保原本的 Identifiers 中已开启 Push Notification 能力,基于其生成.cer
文件,再通过钥匙串生成.p12
文件。(后续App打包时依然用正常的p12文件和profile文件,不需要该文件)
详见 个推官方文档 和 个推官方视频
离线消息
安卓的离线消息推送需要向各个安卓手机厂商申请消息渠道,否则会限制推送频次并静默推送(不支持铃声和震动提示等)
IOS只要开通了“Push Notifications”即可,无额外限制,首次启动会自动申请通知栏权限
部分安卓手机默认不开启通知栏权限(如OPPO),此外也可能遇到用户手动禁用了通知栏权限,此时可手动提示用户开启权限
APP角标
不同安卓厂商有自己的角标接口和权限规定,其中OPPO采用了邀请制,不给予普通APP角标权限。
- uniapp中可通过
plus.runtime.setBadgeNumber(数字)
设置角标,仅小米、VIVO、华为和开通了“Push Notifications”的 IOS 设备支持 - unipush(个推)接口可设置角标,(默认为
+1
)。但大多数机型仅支持传入“+1”,此时会和上述setBadgeNumber
方法冲突,不建议同时使用
接收消息
在App.vue
的onLaunch
中通过uni.onPushMessage((res)=>{})
监听消息。
- 在线默认为透传消息,收到后直接触发回调。
如云函数开启"force_notification": true
则变为通知栏消息,需点击通知栏触发回调 - 离线消息总是为通知栏消息,点击通知栏后启动APP并触发消息
目前安卓部分机型似乎收不到离线回调,只是能启动APP
res
是一个对象,包含type
和data
属性
- type为"click"(点击通知栏)或"receive"(透传)
- data为包含 title、content、payload 的对象
IOS的离线消息中,payload
可能会被JSON序列化
网友评论