酷派开发之 – 苹果推送布告服务(APNs)编制程序

中兴对于应用程序在后台运转有众多限制(除非您越狱)。由此,当用户切换来其余程序后,原先的次序无法保全运会行情状。对于那些须要保持持续连接处境的应用程序(比如社区网络使用),将不能够吸收接纳实时的新闻。

为缓解这一范围,苹果推出了APNs(苹果推送布告服务)。APNs
允许设备与苹果的推送通告服务器保持常连接情形。当你想发送2个推送布告给某些用户的酷派上的应用程序时,你能够运用
APNs 发送2个推送新闻给指标设备十月设置的某部应用程序。

本文中,你将学到创立使用 APNs 的iOS 应用的详细步骤。

制造证书请求

利用APNs 的率先步是生成1个注解请求,使用该证件请求来申请一个用以支付的
SSL 证书。

1. 打开“钥匙串访问”应用程序。

2. 选择“KeychainAccess -> Certificate Assistant -> Request a
Certificate From CertificateAuthority”(如图1 所示):

图片 1

 

3. 输入所需的消息,勾选“Saved to disk”选项,点击 Continue(如图2
所示):

图片 2

 

4. 使用暗中同意文件名把证件请求进行保存(图3):在弹出窗口中,点击Done。

图片 3

 

创建 App ID

各种使用 APNs 的 iOS 应用必须有三个唯一的 App
ID。在本步骤中,你将学到怎样创建推送通告中要用到的App ID。

1. 登录iPhoneDeveloper
Program:http://developer.apple.com/iphone/。点击页面左边的“
小米 Developer Program Portal ”(图4):

图片 4

 

2. 首先看到的是迎接页面(图5):

图片 5

 

3. 点击左边的“App ID”,然后点击左边的“New App ID”按钮(图6):

图片 6

 

4. 在 Description 栏输入“PushAppID”,在“Bundle Seed
ID”栏中选取“Generate New”。在“Bundle
Identifier”栏,输入“net.learn2develop.MyPushApp”,然后点击“Submit”(图7):

图片 7

 

5. 今后您应有能看到所开创的 App ID 了(图8):

图片 8

 

配置 App

要是创造了 App ID,你还要为推送公告对 App ID 实行部分安排。

1. 点击App ID 左侧的 Configure 链接,相会到如下选项(图9):

图片 9

 

勾选“Enable for Apple Push Notificationservice”,点击“Development Push
SSL Certificate”右边的“Configure”按钮。

2. 接下来你会看出“Apple Push Notification service SSL Certificate
Assistant”页面。点击Continue(图10):

图片 10

 

3. 点击Choose File 按钮,选取前边保存的证书请求文件存放地方。点击
Generate(图11):

图片 11

 

4. 你的SSL 证书会被转移。点击 Continue(图12):

图片 12

 

5. 点击Download Now 按钮,下载 SSL 证书。点击 Done(图13):

图片 13

 

6. 下载的 SSL 证书文件名为
aps.developer.identity.cer。双击,将证书安装到钥匙串中(图14)。那个证书会在你的先后中用到,它同意程序接收
APNs 发送来的推送通告。

图片 14

 

创建 Provisioning Profile

接下去,必要创立 provisioning profile 以便允许应用程序安装到实在设备上。

1. 回到iPhone Development Program Portal,点击 Provisioning 栏,点击
New Profile 按钮(图15):

图片 15

 

2. Profile Name 栏输入 MyDevicesProfile,在 App ID 栏接纳PushAppID。在Devices 栏,勾选全体你想激活的装备(在 索爱 Developer
Program Portal 的 Devices 页中登记的享有装备)。点击 Submit(图16)。

图片 16

 

3. provisioning  profile
会等待审查批准。几分钟后,它会显得在页面上。点击Download 按钮下载该
provisioning profile(图17):

图片 17

 

4. 下载下来的provisioning profile 名为
MydevicesProfile.mobileprovision。

激活设备

创立 provision profile 后,你能够将它安装到实际设备中。

1. 将iPhone 或 iPod 连接到 Mac。

2. 把下载下来的 MyDevicesProfile.mobileprovision 文件拖到Dock 栏的
Xcode 图标上。

 

3. Xcode 的 Organizer
程序将起动,选取当前连机的设备。能够观望MyDevicesProfile
已自行安装到设备上了(图18)。

图片 18

 

创办 One plus 应用程序

1. 打开Xcode,创建 View-Based Application 项目,命名为
ApplePushNotification。

2. 把一个 WAV 文件(本例是 beep.wav)拖到Xcode 的 Resouces
文件夹(图19)。

图片 19

 

3. 展开Xcode 中的 Targets 项目,选择ApplePushNotification,按下
⌘+i,在 info 出口,点击Properties 标签栏(图20):

图片 20

 

在 Identifier 文本框,输入net.learn2develop.MyPushApp.

 

4. 点击 Build 标签栏,在 search 输入框中键入Code Signing。在 Any
小米 OS Device 选项,选取正确的 profile(图21):

图片 21

 

 

5. 在 ApplePushNotificationAppDelegate.m
文件中,输入以下代码(加粗部分):

#import “ApplePushNotificationAppDelegate.h”

#import “ApplePushNotificationViewController.h”

 

@implementation ApplePushNotificationAppDelegate

 

@synthesize window;

@synthesize viewController;

 

– (void)applicationDidFinishLaunching:(UIApplication*)application {   

   [window addSubview:viewController.view];

   [window makeKeyAndVisible];

 

    NSLog(@”Registeringfor push notifications…”);   

    [[UIApplication sharedApplication]

       registerForRemoteNotificationTypes:

        (UIRemoteNotificationTypeAlert |

        UIRemoteNotificationTypeBadge |

        UIRemoteNotificationTypeSound)];

}

 


(void)application:(UIApplication*)appdidRegisterForRemoteNotificationsWithDeviceToken:([NSData](http://developer.apple.com/documentation/Cocoa/Reference/Foundation/ObjC_classic/Classes/NSData.html)*)deviceToken
{**

    NSString* \str

[[NSString**](http://developer.apple.com/documentation/Cocoa/Reference/Foundation/ObjC_classic/Classes/NSString.html)

       stringWithFormat:@”Device Token=%@”,deviceToken];

    NSLog(str);

}

 


(void)application:(UIApplication*)appdidFailToRegisterForRemoteNotificationsWithError:([NSError](http://developer.apple.com/documentation/Cocoa/Reference/Foundation/ObjC_classic/Classes/NSError.html) *)err
{**

    NSString* \str

[[NSString](http://developer.apple.com/documentation/Cocoa/Reference/Foundation/ObjC_classic/Classes/NSString.html)stringWithFormat:
@”Error: %@”, err];**

    NSLog(str);   

 

}

 

– (void)application:(UIApplication*)application
didReceiveRemoteNotification:(
NSDictionary*)userInfo
{

    for (id key in userInfo) {

       NSLog(@”key: %@, value: %@”, key, [userInfo
objectForKey:key]);

    }   

}

– (void)dealloc {

   [viewController release];

   [window release];

   [super dealloc];

}

@end

 

 

  1. 按下 ⌘+福特Explorer 运营程序(在真实设备)。按下 shift+⌘+福睿斯 突显Debugger Console
    窗口。查看设备出口到控制台的 device token(图22)。在下图,device token
    是 38c866dd bb323b39 ffa73487 5e157ee5 a85e0b7c e90d56e9fe145bcc
    6c2c594b。记下device token(复制、粘贴到二个文件文件里)

图片 22

 

  1. 一经查阅 HUAWEI/iPod 上的“Settings”程序,你会发现三个 Notifications
    的项(图23):

图片 23

 

创建 Push Notification Provider

Push Notification Provider 是1个应用程序,用于通过 APNs 发送推送布告给
Motorola 应用。

经过 APNs 发送推送通告有多少个步骤:
1. 使用前面创设的 SSL 证书与 APNs 通信;

2. 构造所要发送的消息载体;

3. 发送载体到APNs;

APNs 是3个基于流的 TCP socket,你的 provider 以 SSL
协议与其电视发表。推送布告(包含载体)是以二进制流的不二法门发送的。和APNs
建立连接后,你能够保证该连接并在再而三中断在此之前发送多少个关照。

技巧:
应防止每发送一次推送文告就建立、关闭三回一而再。频仍的建立、关闭连接恐怕会被
APNs 认为是 DOS 攻击,从而拒绝发送 provider 的推送布告发送请求。

1个推送布告音讯的格式如图24 所示:

图片 24

 

越来越多细节,请参考 Apple Push Notification Service Programming
Guide

载体(payload)是 JSON 字符串(最长 256 字节),封装了您发送给 iOS
应用的新闻。那是3个 payload 的事例:

{

   “aps”: {

        “alert” : “Yougot a new message!” ,

        “badge” : 5,

        “sound” : “beep.wav”},

    “acme1” : “bar”,

    “acme2” : 42

}

 

写provider在此以前,我们要求生成php Push Notification
sender供给的证书文件:
  1)在Keychain Access.app里选定这么些新证书(Apple Development Push
Services*),导出到桌面,保存为Certificates.p12.

图片 25

图片 26

 

  2)然后运转如下命令:

   1.     openssl pkcs12 -clcerts -nokeys -out cert.pem -in
Certificates.p12
   2.     openssl pkcs12 -nocerts -out key.pem -in Certificates.p12
   3.     openssl rsa -in key.pem -out key.unencrypted.pem
   4.     cat cert.pem key.unencrypted.pem > ck.pem

 

上边是1个简练的push notification proivder写法:

 

view plain

  1. <span style=”font-size:16px;”><?php  
  2.   
  3. $deviceToken = ’38c866dd bb323b39 ffa73487 5e157ee5 a85e0b7ce90d56e9 fe145bcc 6c2c594b’; // masked for security reason  
  4. // Passphrase for the private key (ck.pem file)  
  5. // $pass = ”;  
  6. // Get the parameters from http get or from command line  
  7. $message = $_GET[‘message’] or $message = $argv[1] or $message = ‘Message received from javacom’;  
  8. $badge = (int)$_GET[‘badge’] or $badge = (int)$argv[2];  
  9. $sound = $_GET[‘sound’] or $sound = $argv[3];  
  10. // Construct the notification payload  
  11. $body = array();  
  12. $body[‘aps’] = array(‘alert’ => $message);  
  13. if ($badge)  
  14. $body[‘aps’][‘badge’] = $badge;  
  15. if ($sound)  
  16. $body[‘aps’][‘sound’] = $sound;  
  17.   
  18.   
  19. $ctx = stream_context_create();  
  20. stream_context_set_option($ctx, ‘ssl’, ‘local_cert’, ‘ck.pem’);  
  21. // assume the private key passphase was removed.  
  22. // stream_context_set_option($ctx, ‘ssl’, ‘passphrase’, $pass);  
  23. $fp = stream_socket_client(‘ssl://gateway.sandbox.push.apple.com:2195’, $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);  
  24. if (!$fp) {  
  25. print “Failed to connect $err $errstrn”;  
  26. return;  
  27. }  
  28. else {  
  29. print “Connection OKn”;  
  30. }  
  31. $payload = json_encode($body);  
  32. $msg = chr(0) . pack(“n”,32) . pack(‘H*’, str_replace(‘ ‘, ”, $deviceToken)) . pack(“n”,strlen($payload)) . $payload;  
  33. print “sending message :” . $payload . “n”;  
  34. fwrite($fp, $msg);  
  35. fclose($fp);  
  36. ?></span>  

运行结果:Connection OKnsending message :{“aps”:{“alert”:”Message
received from javacom”}}n

功能图在上边。

 

为了节约自身编排 push notification provider 的辛劳,你也足以利用 StefanHafeneger 写的八个 Mac OS X
应用程序:PushMeBaby,下载地址

1. 在Xcode 中打开 PushMeBaby。

2. 右击 Resouces 文件夹,选用 Add Existing
Files…,选取前面所下载到的aps.developer.identity.cer 文件(图25)。

图片 27

 

3. 在 ApplicationDelegate.m 文件中,修改如下代码(加粗部分):

– (id)init {

   self = [super init];

   if(self != nil) {

       self.deviceToken = @”38c866dd bb323b39 ffa73487 5e157ee5
a85e0b7ce90d56e9 fe145bcc 6c2c594b”;

        self.payload = @”{aps:{alert:Yougot a
new
message!,badge:5,sound:beep.wav},acme1:bar,acme2:42}”;

       self.certificate =
[[
NSBundle mainBundle]

           pathForResource:@”aps_developer_identity”
ofType:@”cer”];

   }

   return self;

}

 

4. 按下 ⌘+Haval,运营程序。将会问您是否同意使用证书,点击Always
Allow(总是允许)(图26):

图片 28

 

在 BlackBerry/iPod,确认 ApplePushNotification 程序未运转。点击 Push
按钮,会向设施发送一条推送文告。服务器实际上发送了下列新闻给APN 服务器:

{

   “aps”: {

        “alert” : “Yougot a new message!” ,

        “badge” : 5,

        “sound” : “beep.wav”},

    “acme1” : “bar”,

    “acme2” : 42

}

5. 借使音讯推送成功,将会在 BlackBerry/iPod 上出现下图(图27):

图片 29

 

6. 要是未来按下 ⌘+卡宴 调节和测试 ApplePushNotification 程序,然后从
PushMeBaby 中发送一条音信,控制台会展现如下输出:

2009-11-24 21:11:49.182 ApplePushNotification[1461:207]key: acme1,
value: bar

2009-11-24 21:11:49.187 ApplePushNotification[1461:207]key: aps,
value: {

   alert = “You got a new message!”;

   badge = 5;

   sound = “beep.wav”;

}

2009-11-24 21:11:49.191 ApplePushNotification[1461:207]key: acme2,
value: 42

 

多少个注意的题材:

1.万一申请ssl 证书时不是用的新的apple
id,而是原本早就存在的,那么设置好之后要把相应的provisioning profile

也换代一下, 然后去下载新的profile替换掉老的,不然运营会有错。

2.就算你用的是同盟社版的开发者证书,别人也许没有权限去报名那么些ssl
证书,当你替她报名好表明后,应该把证件和注明对

的私钥一起发给她,那样她在地方安装私钥时才会有照应的密钥。

3.当push
notification到达时,程序状态不相同,效果也是分歧的,一般的话程序能够分成下边两种境况:

1)程序不在运营(后台和前台都不在运营)

那儿假诺push
notification到了,会弹出一个alertview,当您点击action按钮时,会运行程序,并进行顺序delegate.m文件里的

 

 

view plain

  1. – (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions  

艺术,所以你能够在此地做一些处理:

 

view plain

  1. //看是还是不是有push notification到达,并做相应处理,这一个方法和local notification相同,但只顾key要对应就行  
  2. UILocalNotification * remoteNotification = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];  
  3. if (remoteNotification) {  
  4.     //弹出2个alertview,展现相应音信  
  5.     UIAlertView * al = [[UIAlertView alloc]initWithTitle:@”receive remote notification!” message:@”hello” delegate:self cancelButtonTitle:@”Ok” otherButtonTitles:nil, nil];  
  6.     [al show];  
  7.     [al release];  
  8. }  

 

2)程序在运维(不论是在前台依然后台)

当push
notification到达时,假如程序在前台运营并不会弹出alertview,而是一贯执行下边方法:

 

view plain

  1.   
  2. – (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {  
  3.       
  4. UIAlertView * al = [[UIAlertView alloc]initWithTitle:@”receive remote notification!” message:@”hey” delegate:self cancelButtonTitle:@”ok” otherButtonTitles:nil, nil];  
  5.     [al show];  
  6.     [al release];  
  7. }  

在这一个法子里你能够获得到userInfo字典来实行相应处理。

设若程序是在后台运维,则会弹出2个alertview,当您点击action按钮,也会进行上边一样的办法。

据此借使您想要程序在push
notification到达时,针对前台和后台运转做区分处理,你能够在地点方法里先做三个景况的

判断:

view plain

  1. //能够依照application状态来判定,程序当前是在前台照旧后台  
  2. UIApplicationState state = [application applicationState];  
  3. if (state == UIApplicationStateInactive) {  
  4.       
  5.     // Application was in the background when notification  
  6.     // was delivered.  
  7. }  

 

 

http://blog.sina.com.cn/s/blog\_7cac85620100vv2b.html

 

原稿链接:http://blog.csdn.net/kmyhy/article/details/6688370

相关文章

网站地图xml地图