本文由信鸽工程师uwei提供。javascript
本文针对iOS推送接入过程当中遇到的一个实际案例,提出了iOS推送排查问题的思路,在解决该问题的基础上,更给出了通用的iOS推送自测的检查路径。
文末提供了一种基于腾讯移动推送(信鸽)的自测工具,欢迎试用与反馈。前端
对于互联网APP的产品运营来讲,因为咱们的用户是不可见的,有时候甚至是在身边的陌生人就在用咱们的产品,可是咱们却有一种近在眼前,远在天边的感受, 物理上的隔离成为了天生的屏障,特别是当产品须要作一个线上有时效性的活动的时候,咱们是多么但愿用户都坐在咱们面前,以便咱们能够随时通知到关于活动的事情。而互联网的运营人员的手段方法多种多样,可是消息推送一直绝对是产品运营的一个必须且重要的手段,消息推送让咱们的用户与咱们之间摆脱了看不见摸不着的尴尬局面。无论咱们的用户在哪里,只要他们联网,消息推送能拉近用户与咱们之间的距离,即便远在天边,可是秒级触达,感受好像尽在身边。java
能够说,如今的APP们,90%都有推送的刚需。而市面上如今已经有不少的第三方推送工具,集成第三方推送工具无疑是一件相对轻松的任务。
但不正确的集成姿式,或者某些错误的配置,经常会致使推送没法正常使用。
好比,
1.Xcode开发环境中关于推送的配置不正确
2.推送证书设置错误或者是证书过时失效ios
那么,集成推送须要注意些什么?
集成以后,怎样确认本身是否正确集成了远程消息推送呢?服务器
相信iOS开发的同窗对下图来讲是比较眼熟的:网络
以上图片就是Xcode不一样版本中关于推送的配置是不一样的,表现如上,可是不一样点具体在哪儿呢?app
使用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的签名信息,其中关于推送的部分以下图ui
可是关于archived-expanded-entitlements.xcent文件,在不一样的Xcode版本中,文件内容是不一样的,具体看下图
能够发现:
在使用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上却收不到推送。
问题描述:
某 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}复制代码
第一步,
先确认在iOS 10如下操做系统中是否正常,
在一台iOS 8的越狱手机上,抓取到了device token,定向推送消息,能够正常收到。
在iOS 9的设备上,使用帐号登陆,反查device token,能够看到登陆的帐号下是有device toekn的,而后使用定向推送,能够正常收到推送消息。
在iOS 10.3.1的设备上,从操做同iOS9的一致,后台显示没有绑定到device token。反复下载重试,结果同样。
第二步,验证包
检查AppStore中的包是否存在问题(咱们不能保证咱们上传的包没有通过Apple的二次改修,事实上Apple会修改咱们上传的iPA文件)
在本地使用iTunes,从AppStore下载某游戏App的最新包,解开包中的文件,找到了archived-expanded-entitlements.xcent文件,打开查看,
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>
而正确的内容应该以下:(举例)
security cms -D -i embedded.mobileprovision > embeded.plist
2.2. 使用文本工具打开 archived-expanded-entitlements.xcent,内容是
由此能够得出结论:
某游戏App在打包的时候,生成的包关于推送的配置存在问题
引入缘由:
Unity里面放了一份entitlements文件,导出到XCode的时候没有被识别到,因此每次XCode都生成一个新的entitlements,致使部分数据丢失(aps-environment键值对)
解决办法:
手动在entitlements文件中添加aps-environment键值对
建议若是在工程代码不存在IDE版本兼容问题的要求,请使用新版本Xcode进行配置打包,而后在根据文档中提到的方法检查iPA包。
最后简单介绍iOS APNs的机制,让咱们了解消息推送的总体流程,
第一步以下图:
application:didRegisterForRemoteNotificationsWithDeviceToken
: 回调函数下发设备token到App第二步
当使用前端网页建立全量推送的时候,XG后台将根据指定的APP,将(推送的内容+在当前这个App下所拥有的token+App指定的证书)做为参数,发送推送请求到APNs,
APNs解密token和token key,以校验请求的有效性,以及推送的目标设备,若是APNs判断请求是合法的,以后就会向指定设备发送通知消息。
以下图:
整个APNs消息的推送流程,能够粗略归纳为下图:
针对iOS平台的推送集成,信鸽iOS开发团队提供了【推送诊断工具】,能够在信鸽官网中【应用列表】->【应用配置】->【信鸽推送助手】
但愿经过以上介绍,可以让团队在使用推送技术的路上,少踩坑,少走弯路,多一点了解,多一点高效。
欢迎访问信鸽官网联系咱们。或经过如下方式:商务合做请联系邮箱:data@tencent.com技术业务请联系邮箱:dtsupport@tencent.com