消息推送踩坑总结

消息推送 总结

这次做了我们项目中的一个消息推送功能,从别的项目迁移过来,和从头做一遍也差的不太多了。目前只有单推。
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格式写错了= =

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值