友盟推送那些问题(iOS10)

上周,公司要实现推送通知的功能,并决定在项目中集成友盟推送的 SDK来代替之前集成的云巴推送。

云巴推送是什么鬼?让我们来看看它的功能和使用场景。

云巴是一个覆盖全国(即将覆盖美国欧洲)的实时消息发布订阅系统,可以以毫秒级的速度向百万乃至千万终端用户发送大量的消息。云巴适用于对实时性和到达率要求高的应用、游戏、设备。云巴支持手机、平板、笔记本、智能硬件、智能家居等作为终端。

云巴在 Github 上开源地址,云巴使用轻量级的 MQTT 作为协议,主要编程语言为 Erlang。云巴支持 IOS, Android, JavaScript, Socket.IO, PHP, C, C#等语言,可以从任一终端向另一终端发送消息。

云巴的特点是:高并发、低耗费、毫秒级、跨平台、跨设备、跨语言。

云巴的应用场景包括:双向消息推送,私信,即时聊天,多人大型游戏,租车打车通知,远程摄像头控制,远程开关空调,实时更新股票走势,实时更新库存量,活动文字直播,实时地理位置地图,智能硬件的 APP 控制,实时统计图表。

其实云巴和友盟在实现推送功能方面没什么太大区别,只是因为云巴推送是在项目赶工期时的产品,具体的交互界面以及参数都没来得及定!所以推送在本次开发任务中交给了不大熟知云巴的我来做,因此换成了被大家熟悉且曾经集成过的友盟推送!

下面介绍一些集成中常出的问题以及自己出现的问题:

1.友盟后台添加新应用,需要上传 P12文件,而 pem 文件是不能上传成功的(本人没有上传成功)

本人从钥匙串中导出文件是只能导出为 pem 文件,但是导出的 pem 文件却不能被友盟后台识别转换

后来发现所导出的证书下面缺少了私钥,并且左侧没有三角标识,如下图:

于是使用公司的苹果开发者帐号里面重新生成了一套 SSL证书(包含私钥,呈现下三角标识),如下图:

左侧的三角标识显示为上图状况时,导出的p12文件才是友盟后台所需要的证书文件(而非钥匙串的 p12文件),把导出的 p12文件(设置密码*)上传到友盟后台,并在相应位置输入刚才设置的相对应证书的密码即可添加应用成功;

随后就可以在 应用信息 一栏中查看应用刚刚添加的应用的 Appkey 和 AppMaster Secret,并可以设置公司推送服务器的IP 地址

2.通过 DeviceToken在友盟后台添加测试设备

查看友盟官方相关deviceToken问题的论坛

2.1
1)使用didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)token获取 token并使用 NSLog 方法打印出来,但是打印出来的 token 如下图:

2.2
2)此时把以上字符串复制粘贴到图2.1的空格中,会标红报错——Device Token不能包含特殊字符,

分析原因得知:刚才拷贝的内容包含尖括号<>以及空格,所以处理办法是——去掉<>和空格后;

3)根据上一步分析,在图2.1空白处将拷贝的内容修改过后,发现仍然报错——Device Token长度错误

分析原因得知:第一步拷贝到2.1图中空白处的内容因为包含空格和尖括号,所以长度已经超出了64,达到了73,而空白处提示 “输入64位*“,所以此处拷贝过来的内容已经被截取了前64位,导致后面的一些字符串被删除掉了,即使删除了尖括号和空格,就会导致被自动截取的前64位中有效的字符串(非空格,非尖括号)不足64位, 所以最有效的处理方法就是———从 1)中拷贝的 token 去除尖括号以及空格

于是获取 token 的方法就使用如下方法:

DeLog(@”UmengDeviceToken-%@”,[[[[deviceToken description] stringByReplacingOccurrencesOfString: @”<” withString: @””]

stringByReplacingOccurrencesOfString: @”>” withString: @””]

stringByReplacingOccurrencesOfString: @” “ withString: @””]);

4)通过3)获取的 token 拷贝粘贴到空白处,并填写设备名称加以区分,即可添加成功测试设备。

3.友盟后台测试单播和自定义播(alias)都能成功,而公司服务器测试单播可成功,而 alias 报2010错误

查看友盟与Alias对应的Device_token 为空的官方论坛 && 单播可收到,广播收不到的官方论坛

1)检查 iOS 客户端代码是否设置别名成功

客户端设置别名(Alias)代码如下:

[UMessage setAlias:@”alias1310” type:@”alias” response:^(id _Nonnull responseObject, NSError * _Nonnull error) {

DeLog(@”成功返回数据–%@”,responseObject);

}];

并且打印信息显示:成功返回数据–{success = ok}

2)通过友盟后台的工具检测设置的 alias 是否成功

3)因为安卓都 OK,考虑到安卓和 iOS 的后台是分开集成的,所以让后台人员配合检查其后台相关代码

后台人员检查无误!!!

4)闹心有木有,到底哪里出了问题呢??

有点信不过后台哥们,于是跑到后台看他们的代码以及相关文档如下:

他们也有个 alias_type:”xx”,阅读后面描述发现端倪,于是查看后台代码中alias_type 值发现:我的代码中的 type 类型值 和后台的竟然没有统一写成一致的,是不是这个问题导致的呢???

于是飞速再键盘上敲下了相同的 alias_type 值,经过测试发现 OK 啦! 报的错误和真正的问题根源还是不大一样的!哦耶

4.自定义弹框偶尔 会弹出两个弹框——自定义的弹框+友盟的默认弹框

这个问题最初没有发现,后来有一次做断点调试的过程中,发现:两个弹框的Bug必现!!!!!

1)因为测试机是 iOS10以下系统,所以在方法 代理方法 didReceiveRemoteNotification: fetchCompletionHandler: 中查看是否关闭友盟弹框

如果是 iOS10系统,需要再方法userNotificationCenter: willPresentNotification: withCompletionHandler: 中查看是否关闭友盟弹框

结果如下图:

2)查看 友盟推送demo中的代码,是否调用了相同的方法

结果如下图:

比较二者,有没有发现二者的区别;两个方法的调用顺去颠倒也会出现 Bug 的,瞬间解决,哦耶!!!

5.在友盟后台测试推送通知时,客户端经常收不到通知!!!

1)请跳转到知乎相关网址去查找相对应的原因;

2)网络很差,推送有延迟,稍等1-3分钟即可收到;

这就是目前在集成友盟推送的开发过程中遇到的一些小插曲,

希望有同样的问题的人可以通过以上解决方法能够顺利解决!!谢谢

如有更多问题请移步到 【友盟+】消息推送常见问题索引