关闭

消息推送

72人阅读 评论(0) 收藏 举报

APNS的推送机制

⾸首先我们看⼀一下苹果官⽅方给出的对ios推送机制的解释。如下图

Provider就是我们⾃自⼰己程序的后台服务器,APNSApple Push Notification Service的缩写,也就是苹果的推送服务器。

上图可以分为三个阶段:第⼀一阶段:应⽤用程序的服务器端把要发送的消息、⺫⽬目的iPhone的标识打包,发给APNS

第⼆二阶段:APNS在⾃自⾝身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发送到iPhone

第三阶段:iPhone把发来的消息传递给相应的应⽤用程序,并且按照设定弹出Push通知。

APNS推送通知的详细⼯工作流程

下⾯面这张图是说明APNS推送通知的详细⼯工作流程:

根据图⽚片我们可以概括⼀一下:

1. 应⽤用程序注册APNS消息推送。
2. iOSAPNS Server获取devicetoken,应⽤用程序接收device token3. 应⽤用程序将device token发送给程序的PUSH服务端程序。
4. 服务端程序向APNS服务发送消息。
5. APNS服务将消息发送给iPhone应⽤用程序。

远程推送操作过程简介

1. App启动过程中,使⽤用UIApplication::registerForRemoteNotificationTypes函数与苹果的APNS服务器通信,发出注册远程推送的申请。若注册成功,回调函

application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken

会被触发,App可以得到deviceToken,该token就是⼀一个与设备相关的字符串.

  1. App获取到DeviceToken后,将DeviceToken发送给⾃自⼰己的服务端。

  2. 服务端拿到DeviceToken以后,使⽤用证书⽂文件,向苹果的APNS服务器发起⼀一个SSL连接。连接成功之后,发送⼀一段JSON串,该JSON串包含推送消息的类型及内容。

  3. 苹果的APNS服务器得到JSON串以后,向App发送通知消息,使得App的回调函数

application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo

userInfo中即可得到推送消息的内容。

⽤用到的证书⽂文件及⽣生成过程

被调⽤用,App

  1. certSigningRequest⽂文件,该⽂文件在MAC系统中⽣生成,⽤用于在Apple⺴⽹网站上申请推送证书⽂文件。 ⽣生成过程: 打开应⽤用程序中的钥匙串访问软件,从菜单中选择 钥匙串访问”-证书助理”-从证书颁发机构请求证书,邮箱和名称随便填写,然后选择保存到磁盘,就可以在本地⽣生成⼀一个CertificateSigningRequest.certSigningRequest⽂文件。

  2. 注册⼀一个⽀支持pushapp id,后⾯面会⽤用到。 ⽣生成过程: 进⼊入developer.apple.com,选择member center - Certificates, Identifiers & Profiles - Identifiers- App Ids,然后选择注册app id,设置appid名称,同时,app id suffix⼀一栏必须选择explicit app id,然后设置bundleid,最后勾选 App Services中的 Push Notifications,这样就可以注册⼀一个⽀支持pushaphid

  3. 推送证书cer⽂文件,该⽂文件在developer.apple.com中⽣生成,⽤用于⽣生成服务端需要的⽂文件。⽣生成过程: 进⼊入developer.apple.com,选择member center - Certificates, Identifiers &Profiles - Certificates,然后选择创建certificate,类型分为DevelopmentProduct。这⾥里以Development为例,选择Apple Push Notification service SSL (Sandbox) ,然后下⼀一步,选择之前⽣生成的⽀支持pushAppId,然后下⼀一步,提交之前创建的CSR⽂文件,再下⼀一步就可以⽣生成cer⽂文件,然后保存到本地。

  4. ⽣生成服务端使⽤用的证书⽂文件。如果是使⽤用⺴⽹网上的mac PushMeBaby⼯工具,在mac机器上进⾏行推送消息的发送,那么有上⾯面的cer⽂文件就够了。如果是使⽤用PHPjava/c#开发⾃自⼰己的服务端,那么还需要将上⾯面的cer⽂文件做⼀一个转换,⽣生成pem⽂文件或者p12⽂文件。

  5. ⽣生成Xcode使⽤用的provisioning⽂文件,该⽂文件⽤用于真机调试。⽣生成过程:进⼊入developer.apple.com,选择member center - Certificates, Identifiers & Profiles -Provisioning Profiles,然后选择创建Provisioning file,接着选择iOS App Development ,下⼀一步选择AppId,选中之前建⽴立的⽀支持pushappid,接着下⼀一步选择⽀支持pushcertificate,下⼀一步勾选需要⽀支持的device id,最后⼀一步设置provisioning⽂文件的⽂文件名,这样provisioning⽂文件就⽣生成了。

客户端的开发

⾸首先下载前⾯面建⽴立的cer⽂文件和provisioning⽂文件,双击,导⼊入到xcode中,在build settingcode signing⼀一栏⾥里选择这两个⽂文件的名称,这样就可以将⽀支持pushapp部署到真机中。然后是要处理推送消息。

客户端对推送消息的处理分两种情况:

1. App没有运⾏行的情况下,系统收到推送消息,⽤用户点击推送消息,启动App。此时,不会执⾏行前⾯面提到的 didReceiveRemoteNotification 函数,⽽而是在AppapplicationDidFinishLaunching函数中处理推送,通过以下代码可以获取推送消息中的数据:

1. APP处于前台时,系统收到推送消息,此时系统不会弹出消息提⽰示,会直接触发application:(UIApplication )application didReceiveRemoteNotification:(NSDictionary)userInfo函数,推送数据在userInfo字典中。

App处于后台时,如果系统收到推送消息,当⽤用户点击推送消息时,会执⾏行application:(UIApplication )application didReceiveRemoteNotification:(NSDictionary )userInfo函数, 此时

NSDictionary *userInfo =[launchOptions objectForKey:UIApplicationLaunchOp
tionsRemoteNotificationKey];

AppDelegate中函数执⾏行的顺序为:

applicationWillEnterForeground
application:didReceiveRemoteNotification

applicationDidBecomeActive
1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:9119次
    • 积分:291
    • 等级:
    • 排名:千里之外
    • 原创:19篇
    • 转载:2篇
    • 译文:0篇
    • 评论:5条