2014.10.30 更新对IOS8推送的兼容。
把以前得IOS8之前的代码。
UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];
#ifdef __IPHONE_8_0 //这里主要是针对iOS 8.0,相应的8.1,8.2等版本各程序员可自行发挥,如果苹果以后推出更高版本还不会使用这个注册方式就不得而知了……
if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]) {
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge|UIUserNotificationTypeSound|UIUserNotificationTypeAlert categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
[[UIApplication sharedApplication] registerForRemoteNotifications];
} else {
UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];
}
#else
UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];
#endif
以上代码便可兼容IOS8。
Push的原理:
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文件。
二.新建一个AppID,在创建界面一定要勾选 Push Notifications这个选项,在页面的最下面,App Services 的大项里面。
Certificates,一定要记住,选择 Apple Push Notification service SSL (Sandbox) 沙箱测试模式。
Certificates之后,下载下来,双击安装。
四。生成*.p12文件
打开钥匙串
在“钥匙串中”-》“登录”。一定要选择两个文件---》导出两个文件。保存为ck.p12.
输入的密码需要记住,之后要用到。
这样就生成了一个PushChatKey.p12文件。
Provisioning Profiles,建好之后下载。
到现在为止,我们已经生成了3个文件。
1、PushDemo.certSigningRequest //第一步产生
2、ck.p12 //第四步产生
3、PushDemoSandBox.cer //第五步产生
六,把ck.p12生成一个文件.pem文件提交给开发服务器程序员
需要在终端中执行以下命令: 当然需要先切换到你ck.p12所在的文件夹的位置,终端切换路径命令为 cd 你的ck.p12路径
- openssl pkcs12 -in ck.p12 -out ck.pem -nodes
生成的ck.p12文件,请给负责服务器的人。
现在我们创建一个简单的iPhone应用程序,包名以及签名证书一定要对应,就是我们刚下下来的PushDemoSandBox.cer
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);
//这边把 DeviceToken 提交给服务器。
}
- (void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error
{
NSLog(@"Failed to get token, error: %@", error);
}