转自:http://blog.csdn.net/kmyhy/article/details/6739584
首先,确定你已经有了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所示的界面。