前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >那些年,我们一起走过的 iOS 推送的坑

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

原创
作者头像
腾讯大数据
修改于 2017-09-05 01:49:47
修改于 2017-09-05 01:49:47
4.5K10
代码可运行
举报
运行总次数:0
代码可运行

本文针对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等)

使用如下命令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

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中,发现了下面输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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这个文件的,文件内容中必须要有以下键值对才能正确使用远程推送

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        <key>aps-environment</key>
         <string>production</string>

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
1 条评论
热度
最新
信鸽产品已下线,另一款推送产品——腾讯移动推送 可以提供更优质的服务。「腾讯云移动推送 TPNS」相比「信鸽产品」的主要区别:1、信鸽推送共享30万条/秒,TPNS推送独享高速通道30万条/秒,更快,更稳定2、信鸽仅支持华为、小米、魅族、FCM厂商通道,TPNS支持华为、小米、魅族、OPPO、vivo、FCM、ROG,覆盖更多机型,更高抵达率3、信鸽共享存储空间,TPNS支持App级数据隔离,且符合GDPR规范,可支持出海业务,更安全4、TPNS更有多样化推送能力(如定时、定速、循环推送;按设备、账号、标签推送;用户分群、A/B test等),精准推送,有效提升推送效果,进入腾讯移动推送 TPNS 产品文档查看更多操作指引 https://cloud.tencent.com/document/product/548/37240?from=13828
信鸽产品已下线,另一款推送产品——腾讯移动推送 可以提供更优质的服务。「腾讯云移动推送 TPNS」相比「信鸽产品」的主要区别:1、信鸽推送共享30万条/秒,TPNS推送独享高速通道30万条/秒,更快,更稳定2、信鸽仅支持华为、小米、魅族、FCM厂商通道,TPNS支持华为、小米、魅族、OPPO、vivo、FCM、ROG,覆盖更多机型,更高抵达率3、信鸽共享存储空间,TPNS支持App级数据隔离,且符合GDPR规范,可支持出海业务,更安全4、TPNS更有多样化推送能力(如定时、定速、循环推送;按设备、账号、标签推送;用户分群、A/B test等),精准推送,有效提升推送效果,进入腾讯移动推送 TPNS 产品文档查看更多操作指引 https://cloud.tencent.com/document/product/548/37240?from=13828
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
App Store上架iOS App的详细流程
登录苹果开发者官网Apple Developer, 点击顶部的Support,点击membership,点击enrollment,最后点击Enrollment的Learn more about these programs链接进入Apple Developer Program - Apple Developer, 打开这个界面后,点击右上角的Enroll按钮,滚动到最底部,点击Start Your Enrollment开始申请:
iOS Magician
2023/03/22
1.6K0
了解iOS消息推送一文就够:史上最全iOS Push技术详解
1)在线Push:比如QQ、微信等IM界面处于前台时,聊天消息和指令都会通过IM自建的网络长连接通道推送过来,这种Push在本文中暂且称为“在线Push”;
JackJiang
2018/08/29
24.4K1
分分钟搞定IOS远程消息推送 原
IOS中消息的推送有两种方式,分别是本地推送和远程推送,本地推送在http://my.oschina.net/u/2340880/blog/405491这篇博客中有详细的介绍,这里主要讨论远程推送的流程与配置过程。
珲少
2018/08/15
1.2K0
分分钟搞定IOS远程消息推送
                                                                            原
iOS推送APNs
APNs,即 Apple Push Notification Service,依托一个或几个系统常驻进程运作,是全局的(接管所有应用的消息推送),可看作是独立于应用之外,设备与苹果的服务器之间维持一个长连接进行消息传递。
Helloted
2022/06/08
3.8K0
iOS推送APNs
iOS 远程推送概念相关准备工作代码实现:(前提:确保bundleID和网站的配置一样)AppDelegate中的全部代码
概念相关 1.什么是远程推送通知? 顾名思义,就是从远程服务器推送给客户端的通知(需要联网) 远程推送服务,又称为APNs(Apple Push Notification Services) 2.为什么需要远程推送通知? 传统获取数据的局限性:只要用户关闭了app,就无法跟app的服务器沟通,无法从服务器上获得最新的数据内容 远程推送通知可以解决以上问题:不管用户打开还是关闭app,只要联网了,都能接收到服务器推送的远程通知 3.所有的苹果设备,在联网状态下,都会与苹果的服务器建立长连接 什么是长连接?
用户2141756
2018/05/18
2K0
iOS推送调试工具Easy APNs Provider的使用
MelonTeam
2018/01/04
3.1K0
iOS推送调试工具Easy APNs Provider的使用
iOS 10 消息推送(UserNotifications)秘籍总结
单独整理消息通知的内容,但是因为工(就)作(是)的(很)事(懒)没有更新文章,违背了自己的学习的初衷。因为互联网一定要有危机意识,说不定眼一睁,我们就欧了 。
java爱好者
2019/06/19
2.8K0
【IOS开发进阶系列】远程消息推送专题
        Provider是指某个iPhone软件的Push服务器,APNS是Apple Push Notification Service的缩写,是苹果的服务器。
江中散人_Jun
2023/10/16
8950
【IOS开发进阶系列】远程消息推送专题
教你实现一个 iOS 重签名工具
对于 iOS 开发者来说,重签名技术应该说是比较熟悉的,而且重签名的实现脚本网上已经有很多,实现逻辑上基本也差不多,其中不乏像 iOS App Signer 这样优秀的重签名工具。
37手游iOS技术运营团队
2022/01/05
4.8K0
教你实现一个 iOS 重签名工具
iOS 证书幕后原理
http://chuquan.me/2020/03/22/ios-certificate-principle/[1],转载已获得作者「楚权」授权。
卤代烃
2021/03/03
1.4K0
iOS 证书幕后原理
iOS逆向(3)-APP重签名
原文地址:https://juejin.im/post/5c7e72cd6fb9a049fc044519”
iOSSir
2019/06/14
1.5K0
iOS逆向(3)-APP重签名
基于APNs最新HTTP/2接口实现iOS的高性能消息推送(服务端篇)
本文原作者:liuyan731,原文地址:liuyan731.github.io/2017/12/05/How-To-Use-APNs-Pushy,内容有改动。
JackJiang
2018/08/29
5.4K1
iOS推送如何实现的?
从图中可以很清楚的看出来推送的原理主要分为以下几步: 1.由App向iOS设备发送一个注册通知,用户需要同意系统发送推送。 2.iOS向APNs远程推送服务器发送App的Bundle Id和设备的UDID。 3.APNs根据设备的UDID和App的Bundle Id生成deviceToken再发回给App。 4.App再将deviceToken发送给远程推送服务器(自己的服务器), 由服务器保存在数据库中。 5.当自己的服务器想发送推送时, 在远程推送服务器中输入要发送的消息并选择发给哪些用户的deviceToken,由远程推送服务器发送给APNs。 6.APNs根据deviceToken发送给对应的用户。 · APNs 服务器就是苹果专门做远程推送的服务器。 ·deviceToken是由APNs生成的一个专门找到你某个手机上的App的一个标识码。 · deviceToken 可能会变,如果你更改了你项目的bundle Identifier或者APNs服务器更新了可能会变。
赵哥窟
2020/06/16
1.1K0
iOS开发之远程推送
  说到远程推送,应该用的也挺多的,今天就基于SEA的云推送服务,做一个推送的小demo,来了解一下iOS中的远程推送是怎么一回事儿,首先你得有苹果的开发者账号,好咸蛋也差不多了,主要内容走起。   一、准备阶段     1.在苹果开发官网上申请推送证书之前需要一个名字叫做certSigningRequest文件。该文件在MAC系统中生成,用于在Apple网站上申请推送证书文件,下面是利用钥匙串生成该文件的步骤:       (1).打开Mac下的钥匙串-》钥匙串访问-》证书助理-》从证书颁发机构请求证书,
lizelu
2018/01/11
1.6K0
iOS开发之远程推送
iOS 开发之实现 App 消息推送(最新)[通俗易懂]
好久没有写过博客啦,今天就由本菜鸟给大家做一个简单的IOSApp消息推送教程吧!一切从0开始,包括XCode6, IOS8, 以及苹果开发者中心最新如何注册应用,申请证书以及下载配置概要文件,相信很多刚开始接触ios的人会很想了解一下。(ps:网上看了一下虽然有很多讲述推送的好教程,我也是看着一步步学会的,但是这些教程的时间都是去年或者更早时期的,对引导新手来说不是很合适)
全栈程序员站长
2022/08/22
5.4K0
iOS 开发之实现 App 消息推送(最新)[通俗易懂]
iOS应用签名(下)
前面的文章我们已经介绍了简单的应用签名但是这种签名方式并不能解决应用滥用的问题,所以苹果又加了两个限制.第一限制在苹果后台注册过的设备才可以安装.第二限制签名只能针对某一个具体的APP.并且苹果还想控制App里面的iCloud/PUSH/后台运行/调试器附加这些权限,所以苹果把这些权限开关统一称为Entitlements(授权文件).并将这个文件放在了一个叫做Provisioning Profile(描述文件)文件中.描述文件是在AppleDevelop网站创建的(在Xcode中填上AppleID它会代办创建),Xcode运行时会打包进入APP内.
iOSSir
2019/04/24
1.2K0
iOS应用签名(下)
前面的文章我们已经介绍了简单的应用签名但是这种签名方式并不能解决应用滥用的问题,所以苹果又加了两个限制.第一限制在苹果后台注册过的设备才可以安装.第二限制签名只能针对某一个具体的APP.并且苹果还想控制App里面的iCloud/PUSH/后台运行/调试器附加这些权限,所以苹果把这些权限开关统一称为Entitlements(授权文件).并将这个文件放在了一个叫做Provisioning Profile(描述文件)文件中.描述文件是在AppleDevelop网站创建的(在Xcode中填上AppleID它会代办创建),Xcode运行时会打包进入APP内. 所以我们使用CSR申请证书时,我们还要申请一个东西!! 就是描述文件!!流程如下
CC老师
2023/03/23
4300
iOS应用签名(下)
iOS远程消息推送
如上是iOS消息推送的详细流程图,主要分为几个过程: (1)App启动过程中,使用UIApplication::registerForRemoteNotificationTypes函数与苹果的APNS(Apple Push Notification Service,苹果消息推送服务器)通信,发出注册远程推送的申请。 (2)若注册成功,APNs 会返回一个设备的标识符即 DeviceToken 给 App,回调函数application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken 会被触发,App可以得到deviceToken。 (3)App获取到DeviceToken后,将DeviceToken发送给自己的服务端。 (4)服务端拿到DeviceToken以后,当有消息要推送时,服务端使用证书文件,向苹果的APNS服务器发起一个SSL连接。连接成功之后,发送一段JSON串,该JSON串包含推送消息的类型及内容。 (5)苹果的APNS服务器得到推送消息(JSON串)以后,向App发送通知消息,使得App的回调函数application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary *)userInfo被调用,App从userInfo中即可得到推送消息的内容。
用户5521279
2019/07/10
4.8K0
iOS远程消息推送
iOS开发之模拟器测试远程推送
Xcode 11.4 之前必须使用第三方和真机来测试远程推送(APNS)。 但 Xcode 11.4 之后可以通过simctl命令在模拟器上进行测试。
YungFan
2020/05/18
1.9K0
iOS APNs的几个问题
2、iOS从APNS Server获取device token,应用程序接收device token。
Light413
2020/04/08
1.9K0
iOS APNs的几个问题
相关推荐
App Store上架iOS App的详细流程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验