那些年,我们一起走过的 iOS 推送的坑

本文针对iOS推送接入过程中遇到的一个实际案例,提出了iOS推送排查问题的思路,在解决该问题的基础上,更给出了通用的iOS推送自测的检查路径。

问题背景

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

可以说,现在的APP们,90%都有推送的刚需。而市面上现在已经有很多的第三方推送工具,集成第三方推送工具无疑是一件相对轻松的任务。 但不正确的集成姿势,或者某些错误的配置,常常会导致推送无法正常使用。 比如, 1.Xcode开发环境中关于推送的配置不正确 2.推送证书设置错误或者是证书过期失效

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

坑:iOS 10推送失败

相信iOS开发的同学对下图来说是比较眼熟的:

以上图片就是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的签名信息,其中关于推送的部分如下图

但是关于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。反复下载重试,结果一样。

第二步,验证包

1.检查AppStore中的包是否存在问题(我们不能保证我们上传的包没有经过Apple的二次改修,事实上Apple会修改我们上传的iPA文件)

在本地使用iTunes,从AppStore下载某游戏App的最新包,解开包中的文件,找到了archived-expanded-entitlements.xcent文件,打开查看,

发现文件中缺少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>

而正确的内容应该如下:(举例)

2.检查提交Apple审核的iPA包,打开包中embedded.mobileprovision,archived-expanded-entitlements.xcent的文件,查看其中的内容 使用以下命令打开第一个文件:

security cms -D -i embedded.mobileprovision > embeded.plist

这个文件中存在关于推送的签名信息,说明当前App是配置了推送证书的。

2.2.使用文本工具打开 archived-expanded-entitlements.xcent,内容是

与从AppStore中下载的安装包中的文件是一致的,说明Apple并没有做额外的处理

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

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

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

坑:问题结论

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

延伸:如何检查iOS推送

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

第一步如下图:

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

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

整个APNs消息的推送流程,可以粗略概括为下图:

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

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

再延伸:推送诊断

针对iOS平台的推送集成,信鸽iOS开发团队提供了【推送诊断工具】,可以在信鸽官网中【应用列表】->【应用配置】->【信鸽推送助手】 希望通过以上介绍,能够让团队在使用推送技术的路上,少踩坑,少走弯路,多一点了解,多一点高效。

文章来源:【腾讯大数据】微信号:tencentbigdata

原创声明,本文系作者授权云+社区-专栏发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小白课代表

这里有一个免费的iOS的SS客户端待您接收!

对于iOS的用户来说,SS客户端要么被下架,要么付费,今天呢,就有一款免费的SS客户端,不过需要抢!数量有限!

1082
来自专栏北京马哥教育

Nginx区分PC或手机访问不同网站

近几年来,随着手机和pad的普及,越来越多的用户选择使用移动客户端访问网站,而为了获取更好的用户体验,就需要针对不同的设备显示出最合适的匹配,...

5268
来自专栏木头编程 - moTzxx

ThinkCMF 初次见面/折腾一下

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

812
来自专栏逸鹏说道

Win10 安装 Linux子系统 Ubuntu18.04 / Kali Linux 的体验

汇总系列:https://www.cnblogs.com/dunitian/p/4822808.html#linux

2326
来自专栏性能与架构

前端工程 - 静态资源的更新

示例 <html> <head> <link href='a.css' type='text/css'/> <script src="b.js"><...

3256
来自专栏酷玩时刻

微信公众号开发之模板消息

其实这个问题很简单,在【微信公众平台】现在已经可以直接查看自己的公众号都能使用那些接口。

823
来自专栏刺客博客

本博客主题分享&附带typecho同款主题

1092
来自专栏菩提树下的杨过

诡异的【session丢失】和【<img src="">标签】

     项目发布到服务器上面了,但是客户在使用的时候发现,只要进入新增页面和修改页面。再进行操作就会自动跳转到登陆页面(我设置了session保存用户登陆信息...

1875
来自专栏Jerry的SAP技术分享

在Windows笔记本上调试运行在iOS设备上的前端应用

我在每天工作中需要在不同的移动设备上测试我们开发的前端应用是否正常工作,比如iOS设备和Android设备。我用的工作笔记本电脑又是Lenovo的,安装的是Wi...

771
来自专栏腾讯大讲堂的专栏

全民K歌后台编译优化:从40分钟到30秒

编者注 全民K歌上线1年半的从0发展到1.5亿,用户越来越多,后台代码库越来越大,编译速度也与日俱慢,编译一下整个工程需要30-40分钟,如何实现秒编至关重要。...

2455

扫码关注云+社区