因为之前一直没有做过利用推送聊天,然后最近项目中也出现了推送相关的问题,最主要的是要利用推送来帮助实现IM。
先说一下所谓的推送机制,我个人理解,所谓的推送无非就是说,每个机器是有自己固定的机器码的,也就是deviceToken,不管你软件换了几个账号,你的deviceToken是不变的,之所以换了号后你收不到之前账号的推送是因为你推送给苹果的那个服务器数据库更新了你账号与机器码的对应,然后你将你这个机器码发给你的服务器,你的服务器呢就拿着你的机器码然后再发给APNS,APNS接收到你服务器的推送之后就会拿到你的机器码,然后将你服务器发的消息,发送到指定机器码的机器上。好吧。貌似就是这样。
关于证书的配置,现在这里只给你们说下关于pem证书的配置,因为在PHP服务端你要给的不再是p12证书,必须是pem证书,这样你的服务器才能有资格叫苹果服务器帮你推送,
if ([[[UIDevicecurrentDevice]systemVersion]floatValue] >=8.0) {
UIUserNotificationSettings *settings = [UIUserNotificationSettingssettingsForTypes:(UIRemoteNotificationTypeBadge |UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound)categories:nil];
[[UIApplicationsharedApplication]registerUserNotificationSettings:settings];
}else{
[[UIApplicationsharedApplication]registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert |UIRemoteNotificationTypeBadge |UIRemoteNotificationTypeSound)];
}
//iOS8
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
{
#if !TARGET_IPHONE_SIMULATOR
//register to receive notifications
[application registerForRemoteNotifications];
#endif
}
- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void(^)())completionHandler
{
#if !TARGET_IPHONE_SIMULATOR
//处理自定义通知
if ([identifierisEqualToString:@"customAction1"]){
}
elseif ([identifierisEqualToString:@"customAction2"]){
}
#endif
}
先说一下上面这三个[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];的意思吧,我理解的是第一个意思是提醒也就是提示框,第二个是你项目弹出提示消息而你又没看时的消息数量,第三个是提示消息来时候的铃声。
这里说明一下,并不是说你注册了你的通知铃声就会响你的那个消息数量就会逐渐增加显示,这些东西注册只是说明你的推送支持这么个功能而已,具体能不能有效果要看你服务器给APNS上传的有没有这些参数,要是没有,呵呵,恭喜你就算你再怎么努力也没用,我就是遇到了这个问题,然后研究一下午发现是服务器方面的问题,直接苦逼了,话说服务器要上传给APNS以下数据
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken;
然后你把你的deviceToken给你的服务器,然后你的服务器上传到苹果服务器,苹果服务器根据你的deviceToken给你发推送,推送过来的消息是在下边方法中获得
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo //这个userInfo中存的就是苹果给你的消息,如果你要想获得消息,那么就在此处获得,对了,这个方法的调用只能是当你的程序处在前台的时候,在后台的时候它是不调用的,所以在后台你是拿不到数据的,只能当你程序进入前台的时候才能获得信息,而且特别注明一点,如果你同时接收了n条推送,那么在你点击最后一条的时候前几条的数据你是获取不到得,这个没办法,所以别指望你用推送来实现IM。
下边这个方法是失败的时候调用的。
- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err {
NSLog(@"didFailToRegisterForRemoteNotificationsWithError=======%@",[NSStringstringWithFormat:@"Error: %@", err]);
}