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路径

  1. 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);    
 }