推送通知详解


( http://blog.csdn.net/showhilllee/article/details/8631734     其他博客资料)

Push的原理:
Push 的工作机制可以简单的概括为下图

图中,Provider是指某个iPhone软件的Push服务器,这篇文章我将使用.net作为Provider。
APNS 是Apple Push Notification Service(Apple Push服务器)的缩写,是苹果的服务器。
上图可以分为三个阶段。
第一阶段:.net应用程序把要发送的消息、目的iPhone的标识打包,发给APNS。 
第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发到iPhone。 
第三阶段:iPhone把发来的消息传递给相应的应用程序, 并且按照设定弹出Push通知。

从上图我们可以看到。
1、首先是应用程序注册消息推送。
2、 IOS跟APNS Server要deviceToken。应用程序接受deviceToken。
3、应用程序将deviceToken发送给PUSH服务端程序。
4、 服务端程序向APNS服务发送消息。
5、APNS服务将消息发送给iPhone应用程序。
无论是iPhone客户端跟APNS,还是Provider和APNS都需要通过证书进行连接的。下面我介绍一下几种用到的证书。
几种证书:
一、*.certSigningRequest文件
1、生成Certificate Signing Request (CSR):

2、填写你的邮箱和Common Name,这里填写为PushChat。选择保存到硬盘。

这样就在本地生成了一个PushChat.certSigningRequest文件。
二、生成*.p12文件
1、导出密钥,并输入你的密码。

输入你的密码:

这样就生成了一个PushChatKey.p12文件。
三、新建一个App ID 和SSL certificate文件
1、用你的付过费的apple帐号登录到 iOS Provisioning Portal 。新建一个App ID。
Description:中输入PushChat
Bundle Seed ID:默认选择Generate New 
Bundle Identifier:输入com.mysoft.PushChat
点击提交

这样就会生成下面这条记录:

点击配置:

出现下面界面,点击继续:

这里我们选择前面生成好的PushChat.certSigningRequest文件,点击生成。

正在生成

生成完毕,我们把它下载下来。命名为aps_developer_identity.cer。

点击完成,你会发现状态变成Enabled。

到现在为止,我们已经生成了3个文件。
1、PushChat.certSigningRequest
2、PushChatKey.p12
3、aps_developer_identity.cer
现在我们创建一个简单的iPhone应用程序。
1、打开Xcode,选择创建一个View-based Application。命名如下图:

2、在PushChatAppDelegate中的didFinishLaunchingWithOptions方法中加入下面代码:
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{self.window.rootViewController = self.viewController;[self.window makeKeyAndVisible];// Let the device know we want to receive push notifications[[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];returnYES;} 
通过registerForRemoteNotificationTypes方法,告诉应用程序,能接受push来的通知。
3、在xcode中运行,会弹出下面的提示框:

选择OK。表示此应用程序开启消息通知服务。
在 PushChatAppDelegate.m代码中添加下面方法获取deviceToken:
- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken{NSLog(@"My token is: %@", deviceToken);}- (void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error{NSLog(@"Failed to get token, error: %@", error);} 
获取到的deviceToken,我们可以通过webservice服务提交给.net应用程序,这里我简单处理,直接打印出来,拷贝到.net应用环境中使用。
发送通知的.net应用程序出来需要知道deviceToken之外,还需要一个与APNS连接的证书。
这个证书可以通过我们前面生成的两个文件中得到。
使用OpenSSL
1、将aps_developer_identity.cer转换成 aps_developer_identity.pem格式。
openssl x509 -in aps_developer_identity.cer -inform DER -out aps_developer_identity.pem -outform PEM
2、将p12格式的私钥转换成pem,需要设置4次密码,密码都设置为:abc123。
openssl pkcs12 -nocerts -out PushChat_Noenc.pem -in PushChat.p12
3、用certificate和the key 创建PKCS#12格式的文件。
openssl pkcs12 -export -in aps_developer_identity.pem -inkey PushChat_Noenc.pem -certfile PushChat.certSigningRequest -name "aps_developer_identity" -out aps_developer_identity.p12
这样我们就得到了在.net应用程序中使用的证书文件:aps_developer_identity.p12。
在.net应用程序中发送通知。
有个开源的类库:apns-sharp。
地址是: http://code.google.com/p/apns-sharp/
我们下载源代码,对里面的JdSoft.Apple.Apns.Notifications做相应的调整就能用了。
我们根据DeviceToken和p12File对JdSoft.Apple.Apns.Notifications.Test做相应的调整,如下图。

这样就OK了。
效果:
通知的代码:
 
for(inti = 1; i <= count; i++){//Create a new notification to sendNotification alertNotification = newNotification(testDeviceToken);alertNotification.Payload.Alert.Body = string.Format("Testing {0}...", i);alertNotification.Payload.Sound = "default";alertNotification.Payload.Badge = i;//Queue the notification to be sentif(service.QueueNotification(alertNotification))Console.WriteLine("Notification Queued!");elseConsole.WriteLine("Notification Failed to be Queued!");//Sleep in between each messageif(i < count){Console.WriteLine("Sleeping "+ sleepBetweenNotifications + " milliseconds before next Notification...");System.Threading.Thread.Sleep(sleepBetweenNotifications);}}
 
用手机拍的ipad上面的显示:


总结:这篇文章主要是详细的讲述了ios消息推送机制的实现,如何通过.net应用程序发送消息给ios应用程序。  




制作苹果推送通知APNS服务器证书文件
1.准备证书申请文件
打开苹果电脑实用工具里的钥匙串访问程序
选择钥匙串访问—>证书助理—>从证书颁发机构申请证书
输入邮件地址,常用名词随便命名,在这里命名为APNS
选择存储到磁盘,将生成的APNS.certSigningRequest文件保存到本地磁盘
此时,在钥匙串访问程序的密钥(Keys)分类里应该可以找到APNS的专用密钥,右键点击导出“APNS”将专用密钥导出为p12文件,保存时会提示输入口令,输入后生成APNS.p12文件
2.准备App ID和SSL证书
登陆苹果开发者门户,点击进入iOS Provisioning Portal—>App IDs
点击New App ID,填写名称以及你应用程序的Bundle Identifier
点击Configure,选中Enable for Apple Push Notification service
点击Development Push SSL Certificate(Production Push SSL Certificate遵循同样的步骤)的Configure按钮
点击Continue,选择刚刚生成的APNS.certSigningRequest点击Generate
稍等几秒就完成证书生成,点击Continue,并Download生成的证书aps_development.cer
3.制作推送服务器需要的p12文件使用MAC命令行下的OpenSSL生成,所用文件:CSR认证签名申请文件(APNS.certSigningRequest),专用密钥(APNS.p12),SSL证书(aps_development.cer)
#将aps_development.cer转换成aps_development.pem格式
openssl x509 -in aps_development.cer -inform DER -out aps_development.pem -outform PEM
#将p12格式的专用密钥转换成pem,依次输入密码
openssl pkcs12 -nocerts -out APNS_Noenc.pem -in APNS.p12
#创建PKCS#12格式的p12文件
openssl pkcs12 -export -in aps_development.pem -inkey APNS_Noenc.pem -certfile APNS.certSigningRequest -name "aps_development" -out aps_development.p12


IPhone开发】Apple Push Notification Service系列:整合私钥和证书,生成.p12文件
1,把.cer文件转换成.pem文件
openssl x509 -in aps_developer_identity.cer -inform der -out PushChatCert.pem
2,把私钥Push.p12文件转换成.pem文件
$ openssl pkcs12 -nocerts -out PushChatKey.pem -in Push.p12
输出内容如下:
Enter Import Password:
MAC verified OK
Enter PEM pass phrase:
Verifying – Enter PEM pass phrase:
你首先需要为.p12文件输入passphrase密码短语,这样OpenSSL可以读它。然后你需要键入一个新的密码短语来加密PEM文件。还是使用”pushchat”来作为PEM的密码短语。你需要选择一些更安全的密码短语。
注意:如果你没有键入一个PEM passphrase,OpenSSL将不会返回一个错误信息,但是产生的.pem文件里面将不会含有私钥。
3,把私钥和证书整合到一个.pem文件里
openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert PushChatCert.pem -key PushChatKey.pem


测试:
1,测试是否能连到测试服务器
 telnet gateway.sandbox.push.apple.com 2195
2,再次连接,这次用我们的SSL证书和私钥来设置一个安全的连接:
openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert PushChatCert.pem -key PushChatKey.pem








苹果信息推送服务(Apple Push Notification Service),是由苹果官方提供的消息推送服务。推送形式包括顶部消息条、声音以及badge number()有了APNS,应用程序可在任意状态接收到与程序有关的消息(包括运行状态not running,foreground以及background),由于在大多数情况下,iOS中最多只有一个应用能处于active状态,所 以,APNS为应用的交互提供了极大的便利。
一:简介
  在使用APNS之前,有这么几点需要了解:1:APNS是免 费的。只要有开发者账号便可以申请APNS证书。2:APNS又是不可靠的,苹果对信息推送的可靠性不做任何保证。3:APNS对消息的大小是有限制的, 总容量不能超过256字节。 清楚了以上三条,各位应该对APNS适用的应用情景有所了解了。 APNS的工作流程如下图所示: 1 & 2:用户第一次安装应用并第一次启动时,会弹出对话框提示应用需要开通推送,是否允许,如果允许,应用会得到一个硬件token。有三点需要注意:第一, 此token唯一与设备相关,同一设备上不同应用获取的token是一样的;第二,当应用被卸载,然后重新安装时,确认对话框不会再出现,自动继承前一次 安装的设置信息;第三,推送设置可以在设置-通知中进行更改。可以选择开启消息框、声音以及badge number中的一种或多种。 3:应用将受到的token发送到服务端,也就是APNS消息的源头。4:应用服务器通过token及证书向苹果的消息服务器发送消息。5:苹果将接收到 的消息发送到对应设备上的对应应用。6:如果应用未处于Active状态(未启动或backgroud),默认设置下,屏幕顶部会弹出消息框,同时有声音 提示,点击改消息框会进入应用,如不点击则应用图标上会有badge number出现。
二:使用步骤
  APNS的 使用并不复杂,但容易出错的环节比较多,特别是证书申请的部分,要特别的注意。下面根据我按教程实际操作的步骤进行阐述:准备工作:A: 一个Xcode工程,我们将其命名为MyPushChat,以及一个对应的App ID.B:一台能用于调试的iOS设备(APNS只能在实体设备上工作,模拟器无法运行)
step1:
  在"应用程序-使用工具"中打开"钥匙串访问"(Keychain Access),如下图所示: 在接下来的对话框中选择存储到磁盘,邮件可随意填写,名称命名为MyPushChat 点击“继续”,将文件名设为"MyPushChat",点击存储。这样,会得到一个名为"MyPushChat.certSigningRequest"的文件,此文件要妥善保管。 从刚刚创建的csr文件中到处私钥,具体操作如下图所示:将导出的文件命名为MyPushChatKey.p12,并输入密码,请牢记此密码,这里姑且设为123456abc。此时,我们已有文件MyPushChat.certSigningRequest,以及MyPushChatKey.p12
step2:
  在App IDs中找到与MyPushChat对应的AppID, 点击右侧"Configure"按钮,勾选下图所示选择框:点 击”Development Push SSL Certificate“右侧的configure按钮,development版本的应用于测试,有效期只有一年,且只能使用苹果的APNS测试服务 器,应用发布时需要申请Distributions版本的证书。Development与Distribution版本的证书获得的Token是不一样 的。弹出框如下所示:上传"MyPushChat.certSigningRequest"并点击Generate,片刻后证书生成完毕,下载,命名为“aps_developer_identity.cer”。
step3:
   打开Provision Portal,点击New Provision,将Provision File命名为"MyPushChat",选择对应的App ID 以及Device并下载。得到文件MyPushChat.provision。双击导入此MyPushChat.Provision文件,如果一切正常, 会弹出Orgnizer, 且显示界面如下所示:
step4:

   将上面得到的文件都保存到桌面。打开Console,切换到桌面。
首先将aps_developer_identity.cer转换成 MyPushChat.cert命令:openssl x509 -in aps_developer_identity.cer -inform der-out MyPushChatCert.pem 
然后将私钥文件转换为MyPushChatKey.pem命令:openssl pkcs12 -nocerts -out MyPushChatKey.pem -in MyPushChatKey.p12Enter Import Password:此处密码输入为前面为私钥设置的密码: 123456abcMAC verified OKEnter PEM pass phrase:这里一定要输入新密码,我们设为123456abcVerifying - Enter PEM pass phrase: 
下一步,将MyPushChatKey.pem及MyPushChatCert.pem合成一个pem文件:命令:cat PushChatCert.pem PushChatKey.pem > ck.pem
 最后,测试一下得到的ck.pem文件首先运行:命令:telnet gateway.sandbox.push.apple.com 2195如果网络正常,会出现如下所示,ctrl + C终止连接。Trying 17.172.232.226...Connected to gateway.sandbox.push-apple.com.akadns.net.Escape character is '^]’. 
然后使用ssl测试连接命令:openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert MyPushChatCert.pem -key MyPushChatKey.pem输入密码123456abc后,如果一切正常,会出现很多的输出,你将可以输入若干字符,回车后,连接将中断。 到此,最繁琐与易错的过程已经完成,证书相关工作到此为止了,进入编码阶段~

step5:
  1:在项目MyPushChat中AppDelegate.m的didFinishLaunchingWithOptions中加入如下代码
  
  
  [plain][/plain] view plain copy
  [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
  (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
  本句代码的作用为在应用第一次启动时弹出对话框让用户确认是否开启消息推送,本句注册的消息类型有BadgeNumber, 声音, 顶部消息框. 可以选择其中的一种或多种。 2:在AppDelegate中加入如下代码:
  
  
  [plain][/plain] view plain copy
  - (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
  {
  NSLog(@"My token is: %@", deviceToken);
  }
  - (void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error
  {
  NSLog(@"Failed to get token, error: %@", error);
  }
   如果获取token成功,运行后控制台中会有如下格式的输出: My token is:<740f4707 bebcf74f 9b7c25d4 8e335894 5f6aa01d a5ddb387 462c7eaf 61bb78ad>将尖括号内容保存,稍后使用同样,在AppDelegate中加入如下代码
  
  
  [plain][/plain] view plain copy
  - (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
  {
  if ( application.applicationState == UIApplicationStateActive ) {
  // 程序在运行过程中受到推送通知
  NSLog("%@", [[userInfo objectForKey: @"aps"] objectForKey: @"alert"]);
  } else {
  //程序为在运行状态受到推送通知
  }
  }
   上面这段代码处理了应用分别在运行和非active状态下接收推送通知的处理方式。 3:下载php样例程序,将其中的devicetoken字段设为刚才保存的token,注意,去掉空格。将password设为123456abc,将 message设为你想设置的内容,保存,然后命令行下进入php源码路径,运行php simplepush.php 如果人品够好,你的设备上马上会咚咚的响一下~
三:其他注意事项
  1:可以使用如下代码判断开启了那些类型的消息通知:
  
  
  [plain][/plain] view plain copy
  UIRemoteNotificationType enabledTypes = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
  if (enabledTypes & UIRemoteNotificationTypeBadge) {
  //开启badge number
  }
  if (enabledTypes & UIRemoteNotificationTypeSound) {
  //开启声音
  }
  if (enabledTypes & UIRemoteNotificationTypeAlert) {
  //开启alert
  }
   2: 推送服务端推荐使用Javapns, 使用很简便,注意其使用的证书文件不是pem,而是p12格式,具体生成方法为: 一:生成csr文件(同上)二:通过csr在苹果网站上生成cert文件(同上)三:双击导入生成的cert文件,在keychain中同时选中csr的 专用秘钥及刚刚导入的ssl证书,右键->导出, 保存为p12其他过程相同 3: 如果有把握,可以直接使用distribution版的证书和provision文件,但线上服务器有一定的限制,如果使用不当,会被苹果当ddos ban掉。 4:苹果的推送服务器会向应用服务器返回一个发送结果,对于一直失败的目标,应用服务端需要进行处理。 5:传送的message为json格式,可以在其中加入自己的字段,但同样,总大小不能超过256字节。 From: http://blog.csdn.net/lifengzhong/article/details/7737028
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值