消息推送 总结
这次做了我们项目中的一个消息推送功能,从别的项目迁移过来,和从头做一遍也差的不太多了。目前只有单推。
ios尝试了原生、javapns、notnoop三种方式做推送,android用了信鸽和个推两种渠道,踩坑无数,做个总结
资源读取问题
文件读取问题
为了读到IOS的认证文件,我试了很多方法。尤其某些情况,为了适用第三方接口的FileInputStream方法读取,我需要任何时候都能实时获取到文件的绝对路径。
certFile使用的是相对于resource目录的路径,如:
“config/push/push.p12”
一开始移植的时候,读取certFile和信任证书的部分都是使用的这种方法:
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(certFilePath)
这样虽然可以很轻松读取到文件流,但是换成第三方接口的时候,我就很难获取到绝对路径了。
之后本地测试的时候,我用了这种方法:
String str = new StringBuffer().append(System.getProperty("user.dir")).append("/src/main/resources").append(cert.getCertFile()).toString();
但这只是缓兵之计,只能用于本地开发时读取,不能动态地得到服务器上的路径
String str = this.getClass().getClassLoader().getResource(cert.getCertFile()).getPath();
这样写可以在不同服务器上,都能读取到resource文件被放置的具体路径。
ios推送 负载构建
payload里面碰到了好多好多问题。
原生
向apns发推送的网络服务client自己整,密钥管理器自己建自己认证,payload自己构建,真的累…有第三方库还是用第三方好,重复造轮子太浪费时间精力了,我尝试了okhttp和restTemplete两种网络服务发请求,都是握手失败(handshake_failure),就跑去用第三方库了
javapns
可以很方便地构造合适的payload,但是如果需要自定义字段的话,就要自己把payload整个字符串整出来,再传进Payload类型的实例里面,有点鸡肋。
而且ios8之后,payload负载限制就从256改到了2kb了,但是javapns库没有更新这个限制,所以最后放弃了这个
notnoop
需要自己构造payload字符串,不记得有没有傻瓜构建payload的方法了。但是这个不会限制payload的长度。
payload json结构:
{
"aps":{
"alert":"test",
"badge":1,
"ex_fields":{
"activeId":798
},
"mutable-content":1,
"my-attachment":"https://f.video.weibocdn.com/002WcZ9zlx07w2kd74CI010412003Y4K0E010.mp4?label=mp4_hd&template=544x960.24.0&trans_finger=8b4ba5dd910e61a4f562dadf6cd9a4e8&Expires=1565337148&ssig=XOHSdvPXWx&KID=unistore,video",
"title":"string"
}
}
一定要有这个"aps"字段,alert, badge, mutable-content等默认字段都放在里面;
多媒体推送
my-attachment中是多媒体资源链接。必须是https的,不好找,可以找微博短视频链接。图片、视频、音频有不一样的大小限制。
mutable-content字段是apns判断多媒体的依据。字段值为1,则是多媒体
关于透传
传的消息一般都分的普通消息和透传消息两种。
普通消息直接发到设备上,由设备上的接收sdk进行处理,然后显示成推送形式;透传消息传到sdk后,不进行处理,而是传给具体的某个应用,由应用本身对其进行处理,进而跳转到应用内某个特定页面,防止跳转过程造成的用户损失。个推的接口,就给开发者提供了链接模板,透传模板,开应用模板等不同的消息模板,可以根据实际需要实现不同的功能。
如果想要跳转到应用内某个具体页面,只能使用透传方式。
apns默认透传。
json解析
使用javapns的自定义payload字符串构建Payload时,遇到了这个问题。百度了一下啊,网上有些错误的原因是UTF-8的BOM头,解决方法:
https://blog.csdn.net/zwc2xm/article/details/53745061
但是我是单纯地把json格式写错了= =