iOS APNs实战分享

序言:android

由于App的功能须要,最近一直在调研苹果的APNs推送,开始时以为超麻烦,如今感受仍是比较easy,“难者不会,会者不难”,本身踩过了这么多的坑终于会了,不出来吐槽(装X)一下对不起本身,23333。ios

在测试发送APNs消息的时候,须要写服务器代码给苹果服务器发消息,本人做为一个纯iOS开发者,对服务器代码十窍通九窍,还好如今网上不少第三方提供这个功能,由于咱们公司使用的是个推,就直接使用个推提供的功能测试了,不须要我来写服务端代码真爽。xcode

准备工做:服务器

一、苹果开发许可证书,分为:开发证书 (iOS App Development)、生产证书(App Store and Ad Hoc)等,后面我使用的是开发证书进行测试。网络

二、苹果开发者网站上注册“AppIDs”,我使用的是“com.crazywolf.yewan”, 勾选“Push No-tifications”。app

三、真机,须要添加到开发许可设备中。测试

四、Provisioning Profiles文件,分:开发时使用(iOS App Development)、生产时使用(App Store、Ad Hoc)等,我在后面使用的是“Development”。网站

五、苹果APNs推送证书,分:开发环境证书 (Development)、生产环境证书(Production)等,一样,也是使用“Development”,注意使用个推平台APNs推送需上传该推送证书,这里我将导出的开发环境证书提交个推平台,关于证书生产和导出能够查看个推 APNs配置技术文档(http://docs.getui.com/mobile/...)。ui

六、Xcode8.2(不一样版本在配置时有点不一样),最低支持版本iOS 8.0。url


一:注册APNs、获取DeviceToken

一、建立新项目或修改老项目,配置项目

clipboard.png

二、注册APNs,获取DeviceToken

clipboard.png

三、使用个推的测试一下,测试DeviceToken

clipboard.png

clipboard.png

是否是很简单,这样就能够获取到APNs推送消息了,有没有一种成功感,不过我开始获取DeviceToken时,一直报(“Error Domain=NSCocoaErrorDomain Code=3000 "未找到应用程序的“aps-environment”的受权字符串" UserInfo={NSLocalizedDescription=未找到应用程序的“aps-environment”的受权字符串}”)错误,网上说是证书没配置好,我从新配置了屡次证书仍是不行,后来问了个推的技术支持才知道Xcode8以上版本须要打开“TARGETS - Capabilities - Push Notifi-cations”,个推的集成文档中也有写,本身太粗心了。

四、APNs环境问题

注意保持推送APNs环境和你的App推送环境一致,由于常常有人会把证书环境搞错,致使推送收不到。

1)直接使用Xcode直接运行到手机上,能够根据“TARGETS -> General -> Signing”中“Provisioning Profile”和“Signing Certificate”来确认。例以下图:

clipboard.png

clipboard.png

分享一下,我在给“Provisioning Profile”文件命名时有个习惯,以“Dev: ”(开发环境)、“In House: ”(企业包环境)、“XC Ad Hoc: ”(分发包环境)、“XC: ”(App Store),其中后面三个都是生产环境。

2)打包成 ipa 包安装到iPhone上,可能会忘记打包时的配置或者是其余人发你的包,是否是就不能知道APNs的环境了? 很早以前个人方法是获取App的 DeviceToken,使用开发和生产环境APNs证书都推送一下,看看是哪一个能推送到。后来发现了还有其余方法的,那就是解析ipa包:

1)先解压ipa包,找到.app文件,显示包内容

2)找到.mobileprovision文件,使用“Atom”打开.mobileprovision文件

3)查找“aps-environment”,查看“aps-environment”这个key值对应value,“development”表示开发环境,“production”表示生产环境。以下图:

clipboard.png

clipboard.png

二:正式推送APNs,推送咱们须要的信息

一、集成个推SDK

clipboard.png

二、使用个推网站上的“透传消息”下发

clipboard.png

clipboard.png

clipboard.png

这样就能够推送自定义消息内容到iPhone上了,到这里APNs的功能已经所有完成了,后面就要看看具体需求了,将个推的服务端集成部分发给大家服务端开发人员,让他“码”起来了,若是有问题,让他们联系个推的技术支持,2333。

三、APNs消息统计

个推最新版本1.5.3 iOS SDK添加了“iOS 10 APNs展现统计”功能,该功能使用到了iOS10 新特性须要添加NotificationService 扩展模块,能准确统计到 iOS10 以上 APNs 展现信息,这个功能太爽了,APNs 展现数据没法统计是多少开发者及运营的痛啊,相信有了这个功能能更好的跟踪APNs推送到达状况。具体集成步骤能够查看“http://docs.getui.com/mobile/...”。
推送成功后能够在个推后台进行查看推送状况, 如图:

clipboard.png

个推渠道下发仍是区分蛮清晰的, 个推成功下发为经过个推通道进行下发, APNs成功下发模块为离线后,走APNs通道下发, 其中上面说的展现统计数据就是 APNs模块中的展现数了。 用户量有点小,别介意哈 zZZ。

四、回调方法区别

APNs的消息在App不一样状态、APNs消息内容、通知操做不一样、iOS系统版本不一样,回调方法也不一样,下面这张图片是上次咨询个推时,个推的技术人员发个人,能够参考看看,注意使用时要测试一下,防止苹果系统又变化了:

clipboard.png
个推的透传消息能够经过方法(“GeTuiSdkDidReceivePayloadData: andTaskId: andMsgId: andOffLine: fromGtAppId: ”)回调获取,由于苹果的APNs推送不保证是否到达和到达时间,因此就可能会丢失,使用个推的透传方法相对APNs更能保证消息的到达率。

说到这里不得不说一下个推的推送机制了,在咱们服务端给个推服务器推送消息时,个推服务器会检查推送对象是否在线(应该是根据个推SDK和个推服务器心跳包和网络链接判断的,超过必定时间没有收到心跳包就是“不在线”,不过这种作法可能会出现假在线状况,就是突然断网,在服务器下次检测心跳包的期间,服务器会认为对象在线):

1)对象在线:下发个推的透传消息,不发送APNs推送消息。
2)对象离线:下发个推的透传消息,发送APNs推送消息。
从上面能够看得出,个推的透传消息是每次都下发的,这样也保证的个推的消息到达率,不过这种作法会出现消息重复,例如是收到消息弹框提醒用户操做,个推透传消息和APNs推送消息都收到了,处理很差的话会提醒用户二次同样的消息。

这里比较好的是个推在透传消息方法中提供了“offLine”字段,这个值是“YES”时,表示这是一条离线消息,在下发个推透传消息时,也发送了APNs推送消息,在处理消息时能够忽略,若是消息的重要性不是很高,能够这么作,由于在忽略个推的透传消息后APNs消息也没有收到,就致使该条消息丢失。
另一种处理方式:参照网上的一些解决方法,我创建一个配置表,处理过的数据在表中标注,防止APNs和个推的透传方法消息重复操做。
五、个推透传消息注意点

clipboard.png

图一

clipboard.png

图二

上面二张图,第一张是个推网站下发透传消息时的界面,第二张是个推透传消息回调方法。须要特别注意的是第一张图中最下面的“payload”和个推透传方法中“payloadData”,这二个中不是同一个概念。

“payload” 是个推自定义字段,添加在APNs的消息内容中,不是苹果原生字段,会经过APNs推送消息一并下发到iPhone客户端,结构如上图中代码块展现,这个字段通常是在APNs消息中添加附带消息,例如附带一个酒吧网站url,在收到通知消息是,发现是url,App直接打开这个网址。
“payloadData”是该条透传消息内容,对应图上的“消息内容”,这个字段不会经过APNs推送到iPhone客户端,是经过个推服务器直接下发给个推SDK的。固然你也能够将“消息内容”和“payload”设置成同样的,这个就看大家的具体使用状况来定了。

再说说第一张中“*拆分Android和iOS推送任务”,选择“是”的话,会拆分Android和iOS推送任务后,将生成两个taskid,分别对android和ios推送数据进行统计和展现,方便以后查询推送数据统计。

最后一个比较实用的就是个推的“高级通知”,以下图,将APNs推送中的字段都列举出来了,不要开发者特地记APNs中有哪些字段,方便一些对APNs还不是很熟悉的初学者使用,固然不包括我了,哈哈哈哈。

clipboard.png

六、发布到AppStore注意点

App发布到AppStore时,须要更换APNs证书或者更换App中个推AppId,由于个推的网站中只能上传一个证书,开发时上传的都是开发APNs证书,当开发测试完成后,准备发布时,App须要生产环境的APNs证书,这时有二种方案可使用:

1)建立二套个推AppId:这种方案是在个推网站中添加二个应用,一个用于开发、一个用于发布,在开发测试期间使用开发的个推AppId,在发布时使用发布的个推AppId,这种方案须要注意发布时切换AppId,忘记换就GG,第一次发布还好,两个个推AppId的做用互换一下就能够了,若是是更新发布,那只能从新提交苹果审核了。

2)更换APNs证书:这种方案是在发布时从新上传生产APNs证书,注意个推的证书更换后须要10分钟左右生效,这种方案须要注意在以后版本更新开发时,须要申请新的个推AppId,否则会影响在线的客户。

我使用的是第一种方案,使用二套个推AppId,个推的文档中也是推荐使用第一种方案。

三:公司服务器本身推送和使用个推推送的流程差别

一、公司服务器本身推送(简称:本身推送)流程

1)注册APNs,获取DeviceToken

2)将DeviceToken和用户ID绑定,保存服务器

3)推送时,根据用户ID获取到DeviceToken,将消息内容、DeviceToken和APNs推送证书发送给苹果服务器

二、使用个推推送流程

1)注册APNs,获取DeviceToken

2)集成个推SDK,获取ClientId,绑定ClientId和DeviceToken

3)将ClientId和用户ID绑定,保存服务器

4)推送时,根据用户ID获取到ClientId, 将消息内容和ClientId发送给个推服务器

四:本身推送和第三方对比

一、成本:本身推送须要专人进行开发,而且须要必定数量的服务器和带宽支持,在开发完成后的使用过程当中还须要有专人进行维护。使用第三方推送,只须要集成SDK就能够实现功能,不只减少了开发成本与维护成本,甚至在推送稳定性上第三方也会比本身作的推送更好一些。

二、精准推送:能够将针对内容及标签等信息进行精准推送,好比将杭州的新闻推送给杭州用户,本身推送须要额外开发,而第三方大部分已经支持这样的功能。

三、推送统计:本身推送仍是须要额外开发该功能,而第三方基本都必备该功能,相对来讲就我如今使用的个推统计效果仍是使人满意的,区分在线下发和APNs下发统计功能,支持通知的展现统计和点击统计,能够知道真实的下发量,下发后有多少被展现了,有多少被点击了。

四、可控性:使用第三方推送可控性过低,想一想,若是第三方推送厂商宕机、或者被黑客攻击了,你服务无法推送了,须要等待第三方厂商响应,或者第三方厂商出问题了,也会影响你的推送。因此那些痛的经验告诉咱们要选择家专业作推送,好比个推,至少人家也是百亿级用户量,服务器挂了怼他去,哈哈。

总结一下:本身推送成本高、服务相对更可控,使用第三方推送成本低、功能更多。建议若是公司特别大,对成本不在意又要求服务可把控,能够本身搭建推送服务,若是是小公司或者才创业的公司,使用第三方厂商更加合适,没有统一答案,要根据自身产品特色、公司状况不断权衡和调整。

五:使用个推后的感觉

一、在开发测试时,更换了推送证书,证书更换后须要10分钟左右生效,测试时感受好麻烦,不能当即生效么。

二、推送时,能够角标自动增长,产品的需求,做为一个开发人员不知道有什么好,不过产品这样要求,只能作了,还好个推支持。

clipboard.png

三、能够统计通知的展现率和点击率,运营同窗能够在推送活动通知后,知道用户对什么样的活动比较感兴趣,更方便他们运营。

clipboard.png

四、能够对指定人群推送,例如咱们活动在上海,能够指定给上海用户大力推送。这个比较好,不用所有用户都发送,保证不相关的用户不被打扰。

五、个推的透传方法能够保证数据的到达,由于苹果的APNs推送不保证是否到达和到达时间,因此就可能会丢失,使用个推的透传方法能够保证能收到消息。

六、在发送透传消息时,“iOS高级通知”中“代码块”功能比较赞,我我的超喜欢,能够提早预览客户端收到APNs通知消息的数据格式。

相关文章
相关标签/搜索