推送通知,也被叫作远程通知,是在iOS 3.0之后被引入的功能。是当程序没有启动或不在前台运行时,告诉用户有新消息的一种途径,是从外部服务器发送到应用程序上的。通常说来,当要显示消息或下载数据的时候,通知是由远程服务器(程序的提供者)发送,而后经过苹果的推送通知服务(Apple Push Notification Service,简称apns)推送到设备的程序上。php
推送的新消息多是一条信息、一项即将到期的日程或是一份远程服务器上的新数据。在系统上展示的时候,能够显示警告信息或在程序icon上显示数字,同时,也能够播放警告音。一旦用户注意到程序有新的信息、时间或是数据,他们能够运行程序并访问新的内容。也能够选择忽略通知,这时程序将不会被激活。ios
iPhone, iPad和iPod touch上同一时刻只有一个app在前台运行。大多数程序在后台运行的时候,能够对某些用户感兴趣的内容作出回应(定时、或数据等)。推送通知能让程序在这些事件发生的时候通知用户。安全
做为提供者为程序开发和部署推送通知,必须经过iOS Developer Program Portal得到SSL证书。每一个证书限用于一个程序,使用程序的bundle ID做为标识。证书有两种用途的:一种是针对sandbox(用于开发和测试),另一种针对发布产品。这两种运行环境拥有为各自指定的IP地址而且须要不一样的证书。还必须为两种不一样的环境获取各自的provisioning profiles。服务器
APNS提供了两项基本的服务:消息推送和反馈服务。app
消息推送:使用流式TCP套接字将推送通知做为二进制数据发送给APNs。消息推送有分别针对开发和测试用的sandbox、发布产品的两个接口,每一个都有各自的地址和端口。无论用哪一个接口,都须要经过TLS或SSL,使用SSL证书来创建一个安全的信道。提供者编制通知信息,而后经过这个信道将其发送给APNs。
注:sandbox: gateway.sandbox.push.apple.com:219
产品接口:gateway.push.apple.com:2195ide
反馈服务:能够获得针对某个程序的发送失败记录。提供者应该使用反馈服务周期性检查哪些设备一直收不到通知,不须要重复发送通知到这些设备,下降推送服务器的负担。
注:sandbox:feedback.push.apple.com:2196
产品接口:feedback.sandbox.push.apple.com:2196测试
下面是一个完整推送流程图加密
从上图,咱们能够看到。 首先是应用程序注册消息推送。 IOS跟APNS Server要deviceToken。应用程序接受deviceToken。 应用程序将deviceToken发送给PUSH服务端程序(Provider)。 服务端程序向APNS服务发送消息。 APNS服务将消息发送给iPhone应用程序。不管是iPhone客户端跟APNS,仍是Provider和APNS都须要经过证书进行链接的:spa
图中:3d
1. Provider是指某个iPhone软件的Push服务器,是咱们将要开发的服务器。
2. APNS 是Apple Push Notification Service(Apple Push服务器)的缩写,是苹果的服务器。
上图能够分为三个阶段:
第一阶段:推送服务器(provider)把要发送的消息、目的iPhone的标识打包,发给APNS;
第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发到iPhone;
第三阶段:iPhone把发来的消息传递给相应的应用程序,而且按照设定弹出Push通知。
1. 使用开发者账号登陆IOS Provisioning ,选择或新建一个App Id,这里以“info.luoyl.iostest”为例
2. 建立完后,进入App Id列表,能够看到新建的App Id默认是没有激活推送功能的,点击Configure连接,进入推送功能激活页面:
3. 在“Enable for Apple Push Notification service”选项上打勾,而后在行点“configure”按钮:
4. 此时会弹出一窗口,点“continue”
5. 弹出证书上传页面,证书选择事先作好的“CertificateSigningRequest.certSigningRequest”,而后点“Generate”按钮;
6. 接下来会有“Your APNs SSL Certificate has been generated.”提示,点“continue”:
7. 下载刚生成的证书“aps_development.cer”到电脑:
8. 至此,appid的Development Push SSL Certificate已经变成“Enabled”状态了:
9. 制做一开发者测试证书,appid指定为“info.luoyl.iostest”, 下载后双击安装到电脑上:
10. 双击在步骤7下载的“aps_development.cer”安装到keychain Access上:
11. 选中push Services证书,右键导出证书为我的信息交换(.p12)格式文件,这里我命名为“aps_development.p12”,点存储时会弹出一个密码设置窗口,可留空不填:
12. 在终端执行下面的命令,把刚才导出的我的信息交换(.p12)格式文件加密转换成推送服务器的推送证书:
上面的命令在执行时有4处是须要输入密码的,其中1和2直接回车,3必须设定一个key如“push”,在4处输入3设定的key “push”;
命令执行完后生成的“iostest_push_dev.pem”就是咱们推送服务器要使用的推送证书;
通过以上步骤的配置,已经完成了开发推送功能所须要的条件了,接下来将会新建一个ios应用来体验完成推送功能,在ios应用须要实现的接口。
为使应用能支持推送功能,咱们的项目配置时要注意:
1.(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
在该方法体里主要实现两个功能:
一是完成推送功能的注册请求,即在程序启动时弹出是否使用推送功能;
二是实现的程序启动是经过推送消息窗口触发的,在这里能够处理推送内容;
3.接收注册推送通知功能时出现的错误,并作相关处理:
4. 接收到推送消息,解析处理
经过上面的代码,基本推送功能的开发已经完成了。最后附件是一个简单的推送demo和demo运行截图,该demo须要推送服务,参考下面附近php代码。