Xcode7下的iOS10推送的两个挫折

251 阅读4分钟

apns9.jpg

首先贴几个网上很火的教程

看完教程感觉推送其实很简单

  • 其实正常做起来也不会太难!
  • 但是我在做推送的时候遇到两个问题

原生的推送(网上的教程)

  • 注册

    if ([application respondsToSelector:@selector(isRegisteredForRemoteNotifications)])  
    {  
        //IOS8  
        //创建UIUserNotificationSettings,并设置消息的显示类类型  
        UIUserNotificationSettings *notiSettings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIRemoteNotificationTypeSound) categories:nil];  
          
        [application registerUserNotificationSettings:notiSettings];  
          
    } else{ // ios7  
        [application registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge                                       |UIRemoteNotificationTypeSound                                      |UIRemoteNotificationTypeAlert)];  
    }  
  • #得到 pToken 后面的php代码里面要用到
// 
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)pToken{  
    NSLog(@"---Token--%@", pToken);  
}  
 
}  
  • #收到推送消息
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{  
      
    NSLog(@"userInfo == %@",userInfo);  
    NSString *message = [[userInfo objectForKey:@"aps"]objectForKey:@"alert"];  
      
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:message delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil nil];  
      
    [alert show];  
}  
  

  • #注册失败后
  

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error{  
  
    NSLog(@"Regist fail%@",error); 
  • #做完上面这些你就会发现执行php 代码推送后,并不能收到消息

    • 经过不断失败的尝试,执行了下面的3步操作后成功得到推送消息

CF0CC7C3-B7C5-4EFE-BB57-9D2F9A38AFA0.png

  • #附一张得到推送消息的截图,第一次推送成功,内心还是很激动的
    ADD17FC8BF48D4F5C3C5DC390BFD5D8A.jpg

然后说下三方推送的问题

  • #附上官方demo
- (BOOL)application:(UIApplication *)application
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
  // Override point for customization after application launch.
  NSString *advertisingId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
  
  if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) {
#ifdef NSFoundationVersionNumber_iOS_9_x_Max
    JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init];
    entity.types = UNAuthorizationOptionAlert|UNAuthorizationOptionBadge|UNAuthorizationOptionSound;
    [JPUSHService registerForRemoteNotificationConfig:entity delegate:self];
#endif
  } else if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
      //可以添加自定义categories
      [JPUSHService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge |
                                                        UIUserNotificationTypeSound |
                                                        UIUserNotificationTypeAlert)
                                            categories:nil];
  } else {
      //categories 必须为nil
      [JPUSHService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge |
                                                        UIRemoteNotificationTypeSound |
                                                        UIRemoteNotificationTypeAlert)
                                            categories:nil];
  }
  
  //如不需要使用IDFA,advertisingIdentifier 可为nil
  [JPUSHService setupWithOption:launchOptions appKey:appKey
                        channel:channel
               apsForProduction:isProduction
          advertisingIdentifier:advertisingId];
  
  //2.1.9版本新增获取registration id block接口。
  [JPUSHService registrationIDCompletionHandler:^(int resCode, NSString *registrationID) {
    if(resCode == 0){
      NSLog(@"registrationID获取成功:%@",registrationID);
      
    }
    else{
      NSLog(@"registrationID获取失败,code:%d",resCode);
    }
  }];

  
  [[NSBundle mainBundle] loadNibNamed:@"JpushTabBarViewController"
                                owner:self
                              options:nil];
  self.window.rootViewController = self.rootController;
  [self.window makeKeyAndVisible];
  rootViewController = (RootViewController *)
      [self.rootController.viewControllers objectAtIndex:0];

  return YES;
}

  • 实践证明按照官网这么写不能完成极光推送到的注册,所以也就收不到推送消息(只要改为下面的代码就可以了)


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    [JPUSHService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge |
                                                      UIUserNotificationTypeSound |
                                                      UIUserNotificationTypeAlert)
                                          categories:nil];

    
    //如不需要使用IDFA,advertisingIdentifier 可为nil
    [JPUSHService setupWithOption:launchOptions appKey:appKey
                          channel:channel
                 apsForProduction:isProduction
            advertisingIdentifier:nil];
  
    return YES;
}