APNs初体验

鉴客 发布于 2012/01/09 19:37
阅读 2K+
收藏 2
iOS

首先,确定你已经有了CSR证书请求、开发证书和App ID。如果你不是第一次开发iOS应用程序,那么你可能已经有了这些东西。那么你可以继续以下的步骤。

一、配置App ID

登录你的provisioningportal,点击左侧边栏的App ID菜单,可以查看你现有的App ID。

点击打开链接

图 1-1

选择一个App ID进行配置。注意列表中有的App ID的Apple Push Notification Service列是灰色的,并且不允许使用Configure按钮。这是因为APNs不支持带统配符的AppID。

你可以配置现有的App ID,也可以重新创建一个。我们假设是后者。点击New App ID,按照如下截图进行设置:

图 1-2

注意,在Bundle Seed ID一栏,苹果提供了Team ID的概念,如果你要和其他应用程序共享钥匙串,可以选择一个已经存在的BundleSeed ID。

点击Submit,马上可以在App ID中看到你新建的PushAppID,点击右边的Configure按钮,进入App ID配置页面:

图 1-3

勾选“Enable for Apple Push Notification service”,点击“Development Push SSLCertificate”右边的“Configure”按钮。

在接下来的“Apple Push Notification service SSL Certificate Assistant”页面中,点击Continue按钮。

然后选择你硬盘上保存的CSR证书请求文件,点击Generate按钮,以生成一个SSL证书。点击download按钮把ssl证书下载到本地 :

图 1-4

文件名为aps_developer_identity.cer,双击,将证书安装到钥匙串中。这个证书会在你的程序中用到,它允许程序接收 APNs 发送来的推送通知。

二、创建 Provisioning Profile

Provisioning Profile用于把ssl证书安装到设备上。点击Provisioning Portal中左侧边栏的Provisioning菜单进入ProvisioningProfile页面。

用New Profile按钮新建一个Provisioning Profile。

图 2-1

ProfileName 填写PushDeviceProfile,Certificate勾选你所用的开发证书(这个证书将和第三步Code Signing中设置的一致),如果不太清楚,把所有证书勾上即可。AppID栏选择我们前面创建的App ID。Devices勾上用于接收推送通知的设备,也可以把所有设备勾上。

点击Submit,将创建Profile。等待几秒刷新页面,Download按钮将出现,下载该证书,文件名为 PushDeviceProfile.mobileprovision。把设备连接上Mac,将该mobileprovision文件拖到 Dock 栏的 Xcode 图标,即可在设备上安装该profile。

三、创建APNs应用程序

创建Window-based Application,命名为APNsTest。准备一个.wav文件,比如machinegun.wav,拖到Groups& Files的resources组中。

选择Targets下的APNsTest,打开info窗口,并切换到Properties页。把Indentifier修改为我们前面创建的AppId:com.ydtf.AppID。

切换到 Build 页,在 search 输入框中键入 Code Signing。在 Any iPhone OS Device 选项,选择正确的profile(请回忆第二步创建Provisioning Profile时选择的证书) ,注意证书和profile是成对使用的,如下图所示 :

图 3-1

在本例中,我们用于代码签名的profile是前面创建的PushDeviceProfile,使用的证书是Hongyan Yang(正是我们在创建profile时,在Certificates栏中选择的证书,见图2-1)。

打开APNsTestAppDelegate.m,找到代码“[windowmakeKeyAndVisible];”,在后面加入:

//注册APNs类型:警告+徽章+声音

[[UIApplication sharedApplication]

 registerForRemoteNotificationTypes:

 (UIRemoteNotificationTypeAlert|

UIRemoteNotificationTypeBadge|

UIRemoteNotificationTypeSound)];

 

然后实现3个方法:

// 注册Device token

- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {

    NSString *str = [NSString

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

NSLog(@"%@",str);

}

// 注册APNs错误

- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err {

    NSString *str = [NSString stringWithFormat: @"Error: %@",err];

NSLog(@"%@",str);

}

// 接收推送通知

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

NSString *msg=[NSString stringWithFormat:@"%@",userInfo];

    UIAlertView* alert=[[UIAlertView alloc]initWithTitle:@"通知"

 message:msg delegate:nil

  cancelButtonTitle:@"OK" otherButtonTitles:nil];

[alert show];

alert=nil;

}

在真实设备上运行程序(不要在模拟器上运行!),iOS会在屏幕出现一个提示框,问你是否同意应用程序APNsTest接收推送通知,当你点击同意后,会在控制台看到输出的Devicetoken:

DeviceToken=<804d95ab 708a0aad 33a08c1f 00341ae2 3774bcb0 02362e33 9a8535758f36dc90>

你可以把这个Device token复制下来,等下要用。

打开设备的“设置->通用”,可以看到所有使用APNs的应用程序列表:

图 3-2

可以看到,我们的APNsTest程序已经注册了APNs类型:标记、提醒、声音。你可以在这里更改这些设置。

四、推送通知提供者

推送通知提供者是一个程序,用于负责和苹果APNs服务器进行SSL通讯,它是实际上的通知发送者。如果你想想用户设备上的应用程序发送消息,实际上是由推送通知提供者进行的。实际上,整个APNs服务由3层应用程序构成:

推送通知提供者、Apple APNs服务器、iOS客户端。

苹果APNs服务器位于两者中间,起到一个中间人的角色。提供者向客户端发送消息,必须由APNs服务器来转发。开发人员除了需要实现客户端外,还需要实现提供者的代码。我们前面创建的SSL证书aps_developer_identity.cer,需要在提供者程序中使用,因为与APNs服务器通讯需要一个合法的SSL数字证书。

如果仅仅是测试,我们可以使用一个其他人已经实现的提供者:

PushMeBaby,下载地址

下载后解压缩,实际上得到的是一个Xcode工程。打开PushMeBaby工程,将aps_developer_identity.cer文件导入到Resources文件夹。

打开ApplicationDelegate.m文件,在init方法找到“self.deviceToken =”一行,将刚才复制的Devicetoken粘贴到这里:

self.deviceToken = @"804d95ab708a0aad 33a08c1f 00341ae2 3774bcb0 02362e33 9a853575 8f36dc90";

把“self.payload =”一行中的You got a new message!替换成我们自己的提示信息“收到一条推送通知。”。

把“self.certificate =”一行中的apns替换成我们自己的SSL文件aps_developer_identity。

运行PushMeBaby,程序显示如下界面:

图 4-1

当提示是否允许使用证书时,选择“总是允许”。然后点击Push按钮。

稍后,你的iPhone/iPod会受到一条推送通知:

图 4-2

如果你点击“显示”按钮,则会启动APNsTest,并立即显示消息的内容。

图 4-3

在我们的self.payload中,仅仅使用了两个基本的通知类型:标记(badge)和提醒(alert)。

self.payload = @"{\"aps\":{\"alert\":\"收到一条推送通知。\",\"badge\":1}}";

实际上我们也可加上声音(sound)或者是其他自定义的键-值对,唯一的限制是整个payload不能超过256字节:

self.payload = @"{\"aps\":{\"alert\":\"收到一条推送通知。\",\"badge\":5,\"sound\":\"machinegun.wav\",\"myData\":12345}}";

还有一个有趣的地方。如果发送通知时,用户的APNsTest已经在当前任务中,那么当用户收到通知时,则忽略通知,并直接在APNsTest程序中呈现如图4-3所示的界面。

加载中
0
来者去者
来者去者
很受用,我现在就在做这个ANPs推送服务机制。
返回顶部
顶部