序言:

因为App的功能需要,最近一直在调研苹果的APNs推送,开始时觉得超麻烦,现在感觉还是比较easy,“难者不会,会者不难”,自己踩过了这么多的坑终于会了,不出来吐槽(装X)一下对不起自己,23333。

先给大家来一个小小福利,因为APNs只能在真机上测试,模拟器上用不了的,如果还没有iPhone的同学,可以借这个机会找老板申请一台iPhone,能不能申请下来就看本事了,我就是没有iPhone,然后用这种方式让公司帮配的iPhone。

然后就是需要写服务代码,在测试发送APNs消息的时候,需要写服务器代码给苹果服务器发消息,本人作为一个纯iOS开发者,对服务器代码十窍通九窍,还好现在网上很多第三方提供这个功能,因为我们公司使用的是个推,就直接使用个推提供的功能测试了,不需要我来写服务端代码真爽。

准备工作:

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

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

3、真机(加油,iPhone在等着你),需要添加到开发许可设备中。

4、Provisioning

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

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

6、Xcode8.2(不同版本在配置时有点不同),最低支持版本iOS 8.0。

一:注册APNs、获取DeviceToken

1、创建新项目或修改老项目,配置项目

2、注册APNs,获取DeviceToken

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

是不是很简单,这样就可以获取到APNs推送消息了,有没有一种成功感,不过我开始获取DeviceToken时,一直报(“Error Domain=NSCocoaErrorDomain Code=3000

"未找到应用程序的“aps-environment”的授权字符串" UserInfo={NSLocalizedDescription=未找到应用程序的“aps-environment”的授权字符串}”)错误,网上说是证书没配置好,我重新配置了多次证书还是不行,后来问了个推的技术支持才知道Xcode8以上版本需要打开“TARGETS -

Capabilities - Push Notifications”,个推的集成文档中也有写,自己太粗心了。

4、APNs环境问题

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

1)直接使用Xcode直接运行到手机上,可以根据“TARGETS -> General

-> Signing”中“Provisioning Profile”和“Signing Certificate”来确认。例如下图:

分享一下,我在给“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”表示生产环境。如下图:

二:正式推送APNs,推送我们需要的信息

1、集成个推SDK

怎么配置个推,可以去看“docs.getui.com/mobile/ios/…/”,配置成功后运行获取个推的“clientId”。

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

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

3、APNs消息统计

个推最新版本1.5.3 iOS SDK添加了“iOS 10 APNs展示统计”功能,该功能使用到了iOS10新特性需要添加NotificationService扩展模块,能准确统计到iOS10以上APNs展示信息,这个功能太爽了,APNs展示数据无法统计是多少开发者及运营的痛啊,相信有了这个功能能更好的跟踪APNs推送到达情况。具体集成步骤可以查看“http://docs.getui.com/mobile/ios/xcode/#6-ios-10-apns”。

推送成功后可以在个推后台进行查看推送情况,如图:

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

4、回调方法区别

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

个推的透传消息可以通过方法(“GeTuiSdkDidReceivePayloadData: andTaskId: andMsgId: andOffLine:

fromGtAppId: ”)回调获取,因为苹果的APNs推送不保证是否到达和到达时间,所以就可能会丢失,使用个推的透传方法相对APNs更能保证消息的到达率。

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

1)对象在线:下发个推的透传消息,不发送APNs推送消息。

2)对象离线:下发个推的透传消息,发送APNs推送消息。

从上面可以看得出,个推的透传消息是每次都下发的,这样也保证的个推的消息到达率,不过这种做法会出现消息重复,例如是收到消息弹框提醒用户操作,个推透传消息和APNs推送消息都收到了,处理不好的话会提醒用户二次一样的消息。

这里比较好的是个推在透传消息方法中提供了“offLine”字段,这个值是“YES”时,表示这是一条离线消息,在下发个推透传消息时,也发送了APNs推送消息,在处理消息时可以忽略,如果消息的重要性不是很高,可以这么做,因为在忽略个推的透传消息后APNs消息也没有收到,就导致该条消息丢失。

另外一种处理方式:参照网上的一些解决方法,我建立一个配置表,处理过的数据在表中标注,防止APNs和个推的透传方法消息重复操作。

5、个推透传消息注意点

图1

图2

上面二张图,第一张是个推网站下发透传消息时的界面,第二张是个推透传消息回调方法。需要特别注意的是第一张图中最下面的“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还不是很熟悉的初学者使用,当然不包括我了,哈哈哈哈。

6、发布到AppStore注意点

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

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

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

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

三:公司服务器自己推送和使用个推推送的流程差异

1、公司服务器自己推送(简称:自己推送)流程

1)注册APNs,获取DeviceToken

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

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

2、使用个推推送流程

1)注册APNs,获取DeviceToken

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

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

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

四:自己推送和第三方对比

1、成本:自己推送需要专人进行开发,并且需要一定数量的服务器和带宽支持,在开发完成后的使用过程中还需要有专人进行维护。使用第三方推送,只需要集成SDK就可以实现功能,不仅减小了开发成本与维护成本,甚至在推送稳定性上第三方也会比自己做的推送更好一些。

2、精准推送:可以将针对内容及标签等信息进行精准推送,比如将杭州的新闻推送给杭州用户,自己推送需要额外开发,而第三方大部分已经支持这样的功能。

3、推送统计:自己推送还是需要额外开发该功能,而第三方基本都必备该功能,相对来说就我现在使用的个推统计效果还是令人满意的,区分在线下发和APNs下发统计功能,支持通知的展示统计和点击统计,可以知道真实的下发量,下发后有多少被展示了,有多少被点击了。

4、可控性:使用第三方推送可控性太低,想想,如果第三方推送厂商宕机、或者被黑客攻击了,你服务没法推送了,需要等待第三方厂商响应,或者第三方厂商出问题了,也会影响你的推送。所以那些痛的经验告诉我们要选择家专业做推送,比如个推,至少人家也是百亿级用户量,服务器挂了怼他去,哈哈。

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

五:使用个推后的感受

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

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

3、可以统计通知的展示率和点击率,运营同学可以在推送活动通知后,知道用户对什么样的活动比较感兴趣,更方便他们运营。

4、可以对指定人群推送,例如我们活动在上海,可以指定给上海用户大力推送。这个比较好,不用全部用户都发送,保证不相关的用户不被打扰。

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

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

iOS APNs实战分享的更多相关文章

  1. fir.im Weekly - 8 个不能错过的 iOS / Android 技术分享

    本期 fir.im Weekly 收集了 2 月下旬新鲜出炉的 iOS /Android 技术分享.源码等,iOS 中图片技术的解压缩.逆向实战.iOS SDK 实践,Android架构思考.Andr ...

  2. erlang -- ios apns provider -- erlang 实现

    os apns-apple notification server 与第三方provider的通信原理网上已有很多介绍,这里不再介绍,有想了解的大家可以去IOS官网https://developer. ...

  3. iOS - GitHub干货分享(APP引导页的高度集成 - DHGuidePageHUD - ②)

    距上一篇博客"APP引导页的高度集成 - DHGuidePageHUD - ①"的发布有一段时间了, 后来又在SDK中补充了一些新的内容进去但是一直没来得及跟大家分享, 今天来跟大 ...

  4. Cordova - 使用Cordova开发iOS应用实战3(添加Cordova控制台插件)

    Cordova - 使用Cordova开发iOS应用实战3(添加Cordova控制台插件) 前文介绍了通过 Safari 的 Web检查器,可以看到控制台输出的信息.但有时这样调试代码不太方便,如果在 ...

  5. Cordova - 使用Cordova开发iOS应用实战2(生命周期、使用Safari调试)

    Cordova - 使用Cordova开发iOS应用实战2(生命周期.使用Safari调试) 前文我们创建了一个简单的Cordova项目,结构如下: 1,Cordova生命周期事件 (1)device ...

  6. Cordova - 使用Cordova开发iOS应用实战1(配置、开发第一个应用)

    Cordova - 使用Cordova开发iOS应用实战1(配置.开发第一个应用) 现在比较流行使用 html5 开发移动应用,毕竟只要写一套html页面就可以适配各种移动设备,大大节省了跨平台应用的 ...

  7. iOS开发——实战OC篇&环境搭建之Xib(玩转UINavigationController与UITabBarController)

    iOS开发——实战OC篇&环境搭建之Xib(玩转UINavigationController与UITabBarController)   前面我们介绍了StoryBoard这个新技术,和纯技术 ...

  8. iOS开发——实战OC篇&环境搭建之纯代码(玩转UINavigationController与UITabBarController)

    iOS开发——实战OC篇&环境搭建之纯代码(玩转UINavigationController与UITabBarController)   这里我们就直接上实例: 一:新建一个项目singleV ...

  9. iOS开发技术分享(1)— iOS本地数据存储

    iOS开发技术分享(1)— iOS本地数据存储 前言: 我本是一名asp.net程序员,后来加入了iOS游戏开发队伍,到现在也有一年多的时间了.这一年来,每天都干到2.3点钟才睡觉,不为别的,只为了学 ...

随机推荐

  1. sql批量更新

    -----------------更新无锡医院名称 update Opt_DKI_Hospital set centerName =tmp.[医院名称] from Opt_DKI_Hospital h ...

  2. USACO 3.3.1 Riding the Fences 骑马修栅栏(欧拉回路)

    Description 农民John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个一个栅栏.你必须编一个程 ...

  3. ZOJ 1842 Prime Distance(素数筛选法2次使用)

    Prime Distance Time Limit: 2 Seconds      Memory Limit: 65536 KB The branch of mathematics called nu ...

  4. vsftpd:非常安全的ftp服务端程序

    主程序:/usr/sbin/vsftpd 主配置文件:/etc/vsftpd/vsftpd.conf CentOS 6  /etc/rc.d/init.d/vsftpd chkconfig vsftp ...

  5. 1st 本周工作量及进度统计

    1. 项目:英文文章词频统计 项目类型:个人项目 项目完成情况:已完成 项目日期:2016.9.6 C(类别) C(内容) S(开始时间) ST(结束时间) I(耽误时间) △(实际时间) 分析 需求 ...

  6. maven 实践 :管理依赖

    有人认为Maven是一个依赖管理工具,当然这种想法是错误的(确切的说Maven是一个项目管理工具,贯穿了整个项目生命周期,编译,测试,打包,发布...),但Maven给人造成这种错误的印象也是有原因的 ...

  7. 对象库(UI MAP)

    目的:能够使用配置文件存储被测页面上元素的定位方式和定位表达式,做到定位数据和程序的分离. 测试程序写好以后,可以方便不具备编码能力的测试人员进行自定义修改和配置 : package dataDriv ...

  8. HDU4473_Exam

    很考验智商的一个题目,赛后看完别人的题解后秒懂了. 首先定义一个函数f(x)表示a,b的有序组合情况数使得a*b为x的一个约数. 现在给定你一个n,要你求出f(1)+f(2)+……+f(n): 题目智 ...

  9. collection 多态 会自动转型为子类 继承多态需要显示转型

  10. InnoDB事务日志(redo log 和 undo log)详解

    数据库通常借助日志来实现事务,常见的有undo log.redo log,undo/redo log都能保证事务特性,undolog实现事务原子性,redolog实现事务的持久性. 为了最大程度避免数 ...