iOS8关于推送方面的问题

    因为之前一直没有做过利用推送聊天,然后最近项目中也出现了推送相关的问题,最主要的是要利用推送来帮助实现IM。

    先说一下所谓的推送机制,我个人理解,所谓的推送无非就是说,每个机器是有自己固定的机器码的,也就是deviceToken,不管你软件换了几个账号,你的deviceToken是不变的,之所以换了号后你收不到之前账号的推送是因为你推送给苹果的那个服务器数据库更新了你账号与机器码的对应,然后你将你这个机器码发给你的服务器,你的服务器呢就拿着你的机器码然后再发给APNS,APNS接收到你服务器的推送之后就会拿到你的机器码,然后将你服务器发的消息,发送到指定机器码的机器上。好吧。貌似就是这样。

关于证书的配置,现在这里只给你们说下关于pem证书的配置,因为在PHP服务端你要给的不再是p12证书,必须是pem证书,这样你的服务器才能有资格叫苹果服务器帮你推送,

pem文件是服务器向苹果服务器做推送时候需要的文件,主要是做服务器的小伙伴们要用,下面介绍一下pem文件的生成。
  • 打开Keychain Access,在Certificates里面找到上篇文章中介绍的包含推送的证书。分别将certificate和private key导出得到.p12文件。例如:Apple Development Push Services > Export “Apple Development Push Services ID123”,保存为 apns-dev-cert.p12。对“Private Key”做同样操作,保存为 apns-dev-key.p12 文件。
  • 需要通过终端命令将这些文件转换为PEM格式:
    openssl pkcs12 -clcerts -nokeys -out apns-dev-cert.pem -in apns-dev-cert.p12
    openssl pkcs12 -nocerts -out apns-dev-key.pem -in apns-dev-key.p12
    此处要求输入一个密码,输入123456.
  • 移除密码(上面的123456)
    openssl rsa -in apns-dev-key.pem -out apns-dev-key.pem
  • 最后,你需要将键和许可文件合成为apns-dev.pem文件,此文件在连接到APNS时需要使用:
    cat apns-dev-cert.pem apns-dev-key.pem > apns-dev.pem

同样 Distribution Certificate 的pem文件生成方式一样。
openssl pkcs12 -clcerts -nokeys -out apns-dis-cert.pem -in apns-dis-cert.p12
openssl pkcs12 -nocerts -out apns-dis-key.pem -in apns-dis-key.p12
openssl rsa -in apns-dis-key.pem -out apns-dis-key.pem
cat apns-dis-cert.pem apns-dis-key.pem > apns-dis.pem

剩下的证书配置这里不再过多阐述,不会的留言,手把手教你,因为iOS8中的推送注册改了方法,现将方法展示如下:

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 sharedApplicationregisterForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];的意思吧,我理解的是第一个意思是提醒也就是提示框,第二个是你项目弹出提示消息而你又没看时的消息数量,第三个是提示消息来时候的铃声。

这里说明一下,并不是说你注册了你的通知铃声就会响你的那个消息数量就会逐渐增加显示,这些东西注册只是说明你的推送支持这么个功能而已,具体能不能有效果要看你服务器给APNS上传的有没有这些参数,要是没有,呵呵,恭喜你就算你再怎么努力也没用,我就是遇到了这个问题,然后研究一下午发现是服务器方面的问题,直接苦逼了,话说服务器要上传给APNS以下数据

  1. {“aps” : {  
  2.   
  3. “alert” : ”You got your emails.”,  
  4.   
  5. “badge” : 9,  
  6.   
  7. “sound” : ”bingbong.aiff”  
  8.   
  9. }  
  10.   
然后你这边才能显示对应的效果,而且关于推送,你要知道,在你的应用程序退到后台的时候,你项目中的任何方法都是不会调用的,别想在后台的时候还利用你的程序做一些东西,这些通知之所以能够显示,是人家苹果自己的机制,你要问怎么改,那我也不知道,叫他开源吧。话说你要是想播放你想要的声音,首先要把你的音乐放在你的项目中,然后你服务器那边设定sound的时候要把后缀名也加上,如果你服务器那边加上了,然后你本地没有存声音,那么就是默认的声音,也就是系统的声音。等你注册成功了,然后苹果会返回一个deviceToken。在下边这个方法中给你,这个是自动调用的,不需要你管

1.在程序运行并在前台的时候可以通过下边方法
2.程序在后台,推送过来的时候点击推送消息也可以通过下边的方法保存

- (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]);

}

3.程序没有启动,推送过来的时候点击推送消息可以通过- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions这个方法保存

貌似也没有什么要注意的东西了。 







你可能感兴趣的:(服务器,推送,IM,苹果,apns)