默认
打赏 发表评论 0
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
信鸽团队原创:一起走过 iOS10 上消息推送(APNS)的坑
阅读(92138) | 评论(0 收藏1 淘帖2
微信扫一扫关注!

导读:本文由腾讯信鸽团队工程师uwei原创分享。文章针对iOS 10推送接入过程中遇到的一个实际案例,提出了iOS推送排查问题的思路,在解决该问题的基础上,更给出了通用的iOS推送自测的检查路径。


1、问题背景


对于互联网APP的产品运营来说,由于我们的用户是不可见的,有时候甚至是在身边的陌生人就在用我们的产品,但是我们却有一种近在眼前,远在天边的感觉, 物理上的隔离成为了天生的屏障,特别是当产品需要做一个线上有时效性的活动的时候,我们是多么希望用户都坐在我们面前,以便我们可以随时通知到关于活动的事情。而互联网的运营人员的手段方法多种多样,但是消息推送一直绝对是产品运营的一个必须且重要的手段,消息推送让我们的用户与我们之间摆脱了看不见摸不着的尴尬局面。不管我们的用户在哪里,只要他们联网,消息推送能拉近用户与我们之间的距离,即使远在天边,但是秒级触达,感觉好像尽在身边。

可以说,现在的APP们,90%都有推送的刚需。而市面上现在已经有很多的第三方推送工具,集成第三方推送工具无疑是一件相对轻松的任务(但实际上iOS平台上的所有第3方推送也都是调用的苹果APNS推送接口,但不用第3方平台自已开发也并不困难,那既然自已能开发本来就很简单,为何第3方平台还乐此不疲的做呢?你懂的,回贴讨论吧哈哈)。

但不正确的集成姿势,或者某些错误的配置,常常会导致推送无法正常使用。

比如:

  • Xcode开发环境中关于推送的配置不正确;
  • 推送证书设置错误或者是证书过期失效。

那么,集成推送需要注意些什么?集成之后,怎样确认自己是否正确集成了远程消息推送呢?

2、iOS 10推送失败这个坑


相信iOS开发的同学对下图来说是比较眼熟的:
信鸽团队原创:一起走过 iOS10 上消息推送(APNS)的坑_1.jpeg

以上图片就是Xcode不同版本中关于推送的配置是不同的,表现如上,但是不同点具体在哪儿呢?

使用Xcode7.3以上版本打包app,导出iPA(这是一个压缩的文件夹),在mac系统中,鼠标右键,使用系统自带Archive Utility工具解开,在进入app所在的Payload文件夹,选择app,点击右键,选择Show Package Contents,进入App包中,可以找到两个文件:

  • embedded.mobileprovision(配置App签名信息);
  • archived-expanded-entitlements.xcent (配置App权限功能,例如远程推送,App Group等)。

使用如下命令:
security cms -D -i embedded.mobileprovision

可以查看App的签名信息,其中关于推送的部分如下图:
信鸽团队原创:一起走过 iOS10 上消息推送(APNS)的坑_2.jpeg

但是关于archived-expanded-entitlements.xcent文件,在不同的Xcode版本中,文件内容是不同的,具体看下图:
信鸽团队原创:一起走过 iOS10 上消息推送(APNS)的坑_3.jpeg

可以发现:

  • 在使用Xcode7.3.1版本进行打包开启了远程推送的工程的时候,工程中并不会自动创建Target-entitlements文件,进而archived-expanded-entitlements.xcent文件中也就不会有aps-environment键值对的信息;
  • 在使用Xcode8.3.2版本进行打包开启了远程推送的工程的时候,工程中会自动创建Target-entitlements文件,进而archived-expanded-entitlements.xcent文件中也就会有aps-environment键值对的信息。

由此可见Xcode的版本更新对推送的配置是有更改的,这个配置的变化,导致有些App即使集成了远程推送,但是在iOS10上却收不到推送。

3、基于一个真实案例来具体分析


1具体案例如下


问题描述:
某 iOS app在接入信鸽SDK 集成推送功能时,遇到在iOS 10 以下版本可以正常推送,但是在iOS 10的版本中,收不到推送消息。

具体现象:
然后将iOS10的设备连接到Xcode,在Xcode中打开连接的设备的控制台,启动某游戏App,在输出的log中,发现了下面输出:
Apr 21 17:53:53 uwei SpringBoard(UserNotificationsServer)[53] <Notice>: No valid 'aps-environment' entitlement string found for application 'com.tencent.dragonnest': (null). Notifications will not be delivered.
Apr 21 17:53:53 uwei dragon[3644] <Notice>: JoyYou-TencentMSDK ::: Register remote notifications failed with error: Error Domain=NSCocoaErrorDomain Code=3000 "no valid 'aps-environment' entitlement string found for application" UserInfo={NSLocalizedDescription=no valid 'aps-environment' entitlement string found for application}

2问题调查路径


【第一步】:先确认在iOS 10以下操作系统中是否正常

  • 在一台iOS 8的越狱手机上,抓取到了device token,定向推送消息,可以正常收到。
  • 在iOS 9的设备上,使用账号登录,反查device token,可以看到登录的账号下是有device toekn的,然后使用定向推送,可以正常收到推送消息。
  • 在iOS 10.3.1的设备上,从操作同iOS9的一致,后台显示没有绑定到device token。反复下载重试,结果一样。


【第二步:验证包】

1. 检查AppStore中的包是否存在问题(我们不能保证我们上传的包没有经过Apple的二次改修,事实上Apple会修改我们上传的iPA文件)。在本地使用iTunes,从AppStore下载某游戏App的最新包,解开包中的文件,找到了archived-expanded-entitlements.xcent文件,打开查看:
信鸽团队原创:一起走过 iOS10 上消息推送(APNS)的坑_4.jpeg

发现文件中缺少aps-environment的键值对,而这正好符合与iOS 10设备的控制台看到的log相符:
No valid 'aps-environment' entitlement string found for application 'com.tencent.dragonnest'

而配置了远程通知的app,在app包中凡是拥有archived-expanded-entitlements.xcent这个文件的,文件内容中必须要有以下键值对才能正确使用远程推送:
<key>aps-environment</key>
<string>production</string>

而正确的内容应该如下(举例):
信鸽团队原创:一起走过 iOS10 上消息推送(APNS)的坑_5.jpeg

2. 检查提交Apple审核的iPA包,打开包中embedded.mobileprovision,archived-expanded-entitlements.xcent的文件,查看其中的内容使用以下命令打开第一个文件:
security cms -D -i embedded.mobileprovision > embeded.plist
信鸽团队原创:一起走过 iOS10 上消息推送(APNS)的坑_6.jpeg
这个文件中存在关于推送的签名信息,说明当前App是配置了推送证书的。

使用文本工具打开 archived-expanded-entitlements.xcent,内容是:
信鸽团队原创:一起走过 iOS10 上消息推送(APNS)的坑_7.jpeg
与从AppStore中下载的安装包中的文件是一致的,说明Apple并没有做额外的处理。

3问题结论及解决方法


由此可以得出结论:
某游戏App在打包的时候,生成的包关于推送的配置存在问题。

引入原因:
Unity里面放了一份entitlements文件,导出到XCode的时候没有被识别到,所以每次XCode都生成一个新的entitlements,导致部分数据丢失(aps-environment键值对)。

解决办法:
手动在entitlements文件中添加aps-environment键值对。

4、坑的结论及规避方法


建议如果在工程代码不存在IDE版本兼容问题的要求,请使用新版本Xcode进行配置打包,然后在根据文档中提到的方法检查iPA包。

5、延伸阅读:如何检查iOS推送是否配置正常


最后简单介绍iOS APNs的机制,让我们了解消息推送的整体流程。

1第一步


  • App使用注册API注册APNs远程推送,如果App已经注册过,并且App指定的token没有发生变化,系统会立即返回给App已经存在的token,直接执行第四步
  • 当需要生成一个新的token时,APNs会使用在设备中的证书来创建,使用一个token key来加密token,然后返回到设备
  • 系统通过application:didRegisterForRemoteNotificationsWithDeviceToken: 回调函数下发设备token到App
  • 一旦App接收到device token,在回调方法中,使用信鸽SDK中的接口,将这个token发送XG服务器。

信鸽团队原创:一起走过 iOS10 上消息推送(APNS)的坑_8.png

2第二步


当使用前端网页创建全量推送的时候,XG后台将根据指定的APP,将(推送的内容+在当前这个App下所拥有的token+App指定的证书)作为参数,发送推送请求到APNs,APNs解密token和token key,以校验请求的有效性,以及推送的目标设备,如果APNs判断请求是合法的,之后就会向指定设备发送通知消息。

如下图:
信鸽团队原创:一起走过 iOS10 上消息推送(APNS)的坑_9.png

整个APNs消息的推送流程,可以粗略概括为下图:
信鸽团队原创:一起走过 iOS10 上消息推送(APNS)的坑_10.png

3小结


那么通过以上的介绍,推送出现问题的可能就可以归纳为以下:

  • 开发环境中关于推送开关选项,推送权限的文件配置不正确;
  • 推送证书设置错误或者是证书过期失效等;
  • device-token 未获取到,或者是获取到了device token,但是发送给XG服务器的姿势不正确;
  • 用户设备关闭了消息推送,或者是设备的网络连接有问题;
  • Apple或者是XG服务器不稳定。

(原文链接:点此进入

6、相关资料


[1] 有关推送技术的文章:
iOS的推送服务APNs详解:设计思路、技术原理及缺陷等
信鸽团队原创:一起走过 iOS10 上消息推送(APNS)的坑
Android端消息推送总结:实现原理、心跳保活、遇到的问题等
扫盲贴:认识MQTT通信协议
一个基于MQTT通信协议的完整Android推送Demo
IBM技术经理访谈:MQTT协议的制定历程、发展现状等
求教android消息推送:GCM、XMPP、MQTT三种方案的优劣
移动端实时消息推送技术浅析
扫盲贴:浅谈iOS和Android后台实时消息推送的原理和区别
绝对干货:基于Netty实现海量接入的推送服务技术要点
移动端IM实践:谷歌消息推送服务(GCM)研究(来自微信)
为何微信、QQ这样的IM工具不使用GCM服务推送消息?
极光推送系统大规模高并发架构的技术实践分享
从HTTP到MQTT:一个基于位置服务的APP数据通信实践概述
魅族2500万长连接的实时消息推送架构的技术实践分享
专访魅族架构师:海量长连接的实时消息推送系统的心得体会
深入的聊聊Android消息推送这件小事
基于WebSocket实现Hybrid移动应用的消息推送实践(含代码示例)
一个基于长连接的安全可扩展的订阅/推送服务实现思路
实践分享:如何构建一套高可用的移动端消息推送系统?
Go语言构建千万级在线的高并发消息推送系统实践(来自360公司)
>> 更多同类文章 ……

[2] 有关QQ、微信的技术文章:
微信后台团队:微信后台异步消息队列的优化升级实践分享
微信团队原创分享:微信客户端SQLite数据库损坏修复实践
腾讯原创分享(一):如何大幅提升移动网络下手机QQ的图片传输速度和成功率
腾讯原创分享(二):如何大幅压缩移动网络下APP的流量消耗(下篇)
腾讯原创分享(二):如何大幅压缩移动网络下APP的流量消耗(上篇)
微信Mars:微信内部正在使用的网络层封装库,即将开源
如约而至:微信自用的移动端IM网络层跨平台组件库Mars已正式开源
开源libco库:单机千万连接、支撑微信8亿用户的后台框架基石 [源码下载]
微信新一代通信安全解决方案:基于TLS1.3的MMTLS详解
微信团队原创分享:Android版微信后台保活实战分享(进程保活篇)
微信团队原创分享:Android版微信后台保活实战分享(网络保活篇)
Android版微信从300KB到30MB的技术演进(PPT讲稿) [附件下载]
微信团队原创分享:Android版微信从300KB到30MB的技术演进
微信技术总监谈架构:微信之道——大道至简(演讲全文)
微信技术总监谈架构:微信之道——大道至简(PPT讲稿) [附件下载]
如何解读《微信技术总监谈架构:微信之道——大道至简》
微信海量用户背后的后台系统存储架构(视频+PPT) [附件下载]
微信异步化改造实践:8亿月活、单机千万连接背后的后台解决方案
微信朋友圈海量技术之道PPT [附件下载]
微信对网络影响的技术试验及分析(论文全文)
一份微信后台技术架构的总结性笔记
架构之道:3个程序员成就微信朋友圈日均10亿发布量[有视频]
快速裂变:见证微信强大后台架构从0到1的演进历程(一)
快速裂变:见证微信强大后台架构从0到1的演进历程(二)
微信团队原创分享:Android内存泄漏监控和优化技巧总结
全面总结iOS版微信升级iOS9遇到的各种“坑”
微信团队原创资源混淆工具:让你的APK立减1M
微信团队原创Android资源混淆工具:AndResGuard [有源码]
Android版微信安装包“减肥”实战记录
iOS版微信安装包“减肥”实战记录
移动端IM实践:iOS版微信界面卡顿监测方案
微信“红包照片”背后的技术难题
移动端IM实践:iOS版微信小视频功能技术方案实录
移动端IM实践:Android版微信如何大幅提升交互性能(一)
移动端IM实践:Android版微信如何大幅提升交互性能(二)
移动端IM实践:实现Android版微信的智能心跳机制
移动端IM实践:WhatsApp、Line、微信的心跳策略分析
移动端IM实践:谷歌消息推送服务(GCM)研究(来自微信)
移动端IM实践:iOS版微信的多设备字体适配方案探讨
信鸽团队原创:一起走过 iOS10 上消息推送(APNS)的坑
>> 更多同类文章 ……

[3] 有关QQ、微信的技术故事:
技术往事:创业初期的腾讯——16年前的冬天,谁动了马化腾的代码
技术往事:史上最全QQ图标变迁过程,追寻IM巨人的演进历史
开发往事:深度讲述2010到2015,微信一路风雨的背后
开发往事:微信千年不变的那张闪屏图片的由来
开发往事:记录微信3.0版背后的故事(距微信1.0发布9个月时)
一个微信实习生自述:我眼中的微信开发团队
>> 更多同类文章 ……

即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

上一篇:[已回复] MobileIMSDK android版用服务端向客户端发消息失败下一篇:使用WebSocket和SSE技术实现Web端消息推送

本帖已收录至以下技术专辑

推荐方案
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部