一步一步实现iOS应用PUSH功能

来源:互联网 发布:htc g16软件下载 编辑:程序博客网 时间:2024/06/05 11:05

一步一步实现iOS应用PUSH功能

FEB 27TH, 2013

1. push原理

iOS push 工作机制可以用下图简要概括

  • Provider:应用自己的服务器;
  • APNS:Apple Push Notification Service的简称,苹果的PUSH服务器;

push的主要工作流程是:

  • iOS设备连接网络后,会自动与APNS保持类似TCP的长链接,等待APNS推送消息的到来;
  • 应用启动时注册消息推送,并获取设备的在APNS中注册的唯一设备标示deviceToken上传给应用服务器(即Provider);
  • 在需要给应用推送消息时,Provider把push内容、接收push消息的deviceToken按APNS指定的格式打包好,发送给APNS;
  • APNS收到Provider发送的消息后,查找deviceToken指定的设备,如果该设备已经和APNS建立了连接,则立即将消息推送给该设备,如果设备不在线,则在该设备下次连接到APNS后将消息推送到设备。请注意苹果并不保证推送一定成功;
  • 设备收到push消息后,iOS系统会根据SSL证书判断这个push消息是发给那个应用的,进而启动相应客户端。

上述过程中,有两个关键步骤需要自己处理的是:1.客户端获取deviceToken,并上传到Provider;2.Provider发送push消息到APNS。这两个步骤中都需要苹果的push证书授权,下面就来介绍如何生成push证书,以及Provisioning Profile。

2. push证书及Provisioning Profile生成

  • 用付费帐号登录到http://developer.apple.com/iphone/index.action

  • 生成push证书前要先生成开发证书

    生成开发证书的过程不详细介绍,可以参考如何联机调试和发布程序。只是有一点需要注意的,生成开发证书过程中需要通过Keychain生成一个CSR文件,默认名为CertificateSigningRequest.certSigningRequest,这个文件将在生成push证书的时候用到。

  • 创建一个App ID

    • 创建过程中Description可以任意填写,比如叫push_demo
    • Bundle Identifier一般用com.company.appname这样的格式,例如com.mycompany.demo

    注意:要用push功能的Bundle Identifier一定不能出现通配符,比如com.mycompany.*,这样的名字是不能使用push的。

  • 生成Push SSL Certificate

    生成好App ID后点击Configure进入配置页。打开Enable for Apple Push Notification service选项,该选项下有Development Push SSL CertificateProduction Push SSL Certificate两个SSL Certificate可以配置,前面一个是用来的开发的push证书,后面一个是用来发布的。我们以开发push证书为例,点击Development Push SSL Certificate->Configure,后面会要求选择CSR文件,这就是生成开发证书时的CertificateSigningRequest.certSigningRequest文件,选择好CSR后就生成好相应的SSL Certificate了。下载下来,保存名为aps_developer.cer

  • 从Keychain中导出私钥、设置好密码,命名为private_key.p12

  • 生成push证书

    • 这时我们一共得到3个文件:

      1. CertificateSigningRequest.certSigningRequest
      2. private_key.p12
      3. aps_developer.cer
    • 将aps_developer.cer转成pem格式

      openssl x509 -in aps_developer.cer -inform DER -out aps_developer.pem -outform PEM 
    • 将private_key.p12格式的私钥转换成private_key.pem

      openssl pkcs12 -nocerts -out private_key.pem -in private_key.p12

      这一步会要求输入p12私钥的密码,以及设置新生成的pem的密码。

    • 创建用于服务端的SSL p12格式证书,命名为aps_developer.p12

      openssl pkcs12 -export -in aps_developer.pem -inkey private_key.pem -certfile CertificateSigningRequest.certSigningRequest -name "aps_developer" -out aps_developer.p12

      这一步会要求输入private_key.pem的密码,注意不是private_key.p12的密码。如果密码错误,或者CertificateSigningRequest.certSigningRequest文件不匹配都不能正常生成aps_developer.p12文件,如果生成的aps_developer.p12文件大小是0,说明生成过程中出了问题,请检查pem私钥、密码、以及CertificateSigningRequest.certSigningRequest是否正确。

      aps_developer.p12就是Provider向APNS发送push消息需要的SSL证书。把这个证书和密码提供给服务端,服务端就可以发送push消息给APNS了。这时服务端已经可以工作了,但客户端还必须配置相应的Provisioning Profile才能启动应用的push功能。

      服务器配置需注意的是,由于我们生成的是开发环境的push证书,所以服务器应该连接APNS的sandbox环境地址:gateway.sandbox.push.apple.com:2195,如果应用正式发布,就要连接正式环境,必须生成相应的发布证书,并连接APNS正式环境地址:gateway.push.apple.com:2195

  • 生成Provisioning Profile

    • 新建Profile,命名为push_dev;
    • 选择相应证书;
    • App ID选择push_demo;
    • 选择设备;
    • 下载并安装该Profile供开发使用;

3. Xcode证书设置、Info.plist设置

  • 用Xcode打开客户端工程,设置Info.plist的Bundle identifier为com.mycompany.demo
  • 打开工程设置,必须将证书设置为与push_dev关联的证书。

4. 客户端获取deviceToken

服务端要发送push消息给某一设备还必须知道该设备的deviceToken。应用运行后获取到deviceToken,然后上传给服务器,下面介绍应用如何获取deviceToken。应用必须先注册使用push功能。

123456
  - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {      [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeBadge)];      // do something      // ...  }

在AppDelegate中添加下面方法来获取deviceToken:

123456789
  - (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {      NSString *token = [NSString stringWithFormat:@"%@", deviceToken];      NSLog(@"%@", token);  }  - (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {      NSLog(@"%@", error);  }

应用获取到deviceToken后,上传给Provider,Provider就可以用这个deviceToken给这个设备push消息了。

5. Payload格式及自定义数据

服务器配置好证书并拿到deviceToken后就可以向APNS发送消息了。发送消息的格式如下图所示:

Payload就是push的消息负载,这就是应用需要关心的数据。 Payload是一个JSON字典,最大值是 256 字节,超过这个限制,APNS将拒绝转发。基本格式如下:

12345678
  {    "aps": {      "alert":"Hello Push!",      "badge":1,      "sound":"default"    }  }

必须包含aps键值。badge表示应用程序图标显示的数字,sound表示收到push的提示音。 Payload的具体结构参考Apple Push Notification Service

要在这个结构中新增自定义数据,请加在aps空间之外。比如后台推送消息给应用同时要求应用打开某个页面:

123456789
  {    "aps": {      "alert":"Hello Push!",      "badge":1,      "sound":"default"    },    "page":"home"  }

后台告诉客户端收到这个push后打开应用的主页,这里的page、home都是自己定义的。必须注意的是,Payload大小不能超过限制,所以可以把自定义数据更简化点,比如可以把home与编号1对应,page简写为p,这样"p":1表示打开主页,可以缩小Payload的大小。

6. 客户端接收push消息

iOS系统收到push消息后,如果用户点击查看,系统将根据证书启动相应应用。如果应用已经启动,将调用AppDelegate的方法:

1234
  - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {      // userInfo 就是push消息的Payload  }

如果应用还没有启动,通过push冷启动后,仍然能在启动后获取Payload:

12345
  - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {      NSDictionary* userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];      NSLog(@"Payload: %@", userInfo);  }

目前为止,push功能基本就完成了,可以开始push功能测试了,如果服务器还没开发完成,或者想快速测试是否能正常push,可以使用下面的代码实现后台push测试。发送push前要配置好SSL证书,以及deviceToken和Payload结构。

object c 版本
c 版本
java 版本
php 版本

还有个小问题,当Payload设置了badge,应用图标上将一直显示一个数字提示,如果要清除数字提示,或者设置成其他数字,调用下面函数就可以完成。

12
  [[UIApplication sharedApplication] setApplicationIconBadgeNumber:number];

number为0就会清除数字提示。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孕妇眼睛充血很快就有眼屎怎么办 婴儿的眼睛流泪生眼屎怎么办呀 刚出生的婴儿眼睛有眼屎怎么办 25天的婴儿鼻子有鼻屎不通怎么办 一个月的宝宝好多鼻屎怎么办 隆鼻取线的时候好多鼻屎怎么办 小孩流浓鼻涕怎么办最简单方法 小孩流黄鼻涕怎么办最简单方法 一岁八个月宝宝鼻涕和痰多怎么办 空调铜管过不了预埋管的弯头怎么办 如果朝鲜和韩国打起来中国怎么办 寄信时不知道对方的邮编怎么办 地下钱庄转账后银行户被冻结怎么办 老师遇到素质极差的垃圾学生怎么办 验证码忘了手机号也换了怎么办 手机上的验证码忘了怎么办 进入医联网的验证码忘了怎么办 育碧换电脑了无法同步云存档怎么办 刺客信条起源育碧需要激活码怎么办 电脑连不上网怎么办wifi可以用 电脑登录账号密码错误锁定了怎么办 白色T恤衫上沾上黑色的黄油怎么办 家教遇到成绩好的学生该怎么办 跟越南人离婚孩子中国户口9怎么办 老婆是个越南人至今没户口怎么办 等离子屏z板链接处排线打火怎么办 等离子自动调焊的成形不好怎么办 村里内村道路中间被抢占了怎么办 华为换电池之后卡没反应怎么办 汽车钥匙换电池后没反应怎么办 汽车解锁换电池后没反应怎么办 包裹显示待收件人向海关申报怎么办 在越南签证被公安扣了怎么办 酷派手机收不到验证码怎么办 苹果想把图片上的字盖上怎么办 婴儿自己把眼珠子抠红了怎么办 如果美陆战队员进入台湾那怎么办? 顺产生完小孩吸不通奶怎么办 耐克空军一号白色底发黄怎么办 中行网银u盾丢了怎么办 有人用你的手机号码不停注册怎么办