[size=18px]iOS推送出了点问题,之前还好好的,而且上线过好几版了,最近测试说iOS好多用户收不到推送了,然后Debug发现:既不调用- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken方法,也不调用- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error 方法。之前在Xcode6上还好好的,升级到Xcode7之后就这两个方法都调用不进去了。然后再用Xcode6打开也同样调不进去了。升级到Xcode7之后,在适配iOS9的时候改过一些配置文件。首先说明几点:
1,已经确保证书没问题,因为我新建了个测试工程,用同一个证书却可以调用- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken方法。并且原来的项目和新建的测试工程在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中的代码是一模一样的。测试工程能回调- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken方法,但原项目不回调,也不调用- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error方法。2,确定手机已经联网。3,也有是否接受消息通知的弹窗,而且设置-通知里边确定是允许推送的。补充,原项目和新建的测试工程在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中的代码一模一样,如下:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
#ifdef __IPHONE_8_0
    if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]) {
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge|UIUserNotificationTypeSound|UIUserNotificationTypeAlert categories:nil];
        [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
    }  else {
        UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
        [[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];
    }
#else
    UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];
#endif    return YES;
}
如有人遇到同样的问题,请帮忙解答,非常感谢!

解决方案 »

  1.   

    好像你只注册了监听的设置,并没有监听远程消息啊
    漏了这一句
    [[UIApplication sharedApplication] registerForRemoteNotifications];
      

  2.   


    这句不是只在iOS8以后才需要吗?我后面有写的,在下面这个方法里:
    #ifdef __IPHONE_8_0
    - (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
    {
        [application registerForRemoteNotifications];
    }
    #endif
      

  3.   

    我也是用的xcode7啊,下面的code工作很正常//-- Set Notification
        if ([application respondsToSelector:@selector(isRegisteredForRemoteNotifications)])
        {
            // iOS 8 Notifications
            [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
            
            [application registerForRemoteNotifications];
        }
        else
        {
            // iOS < 8 Notifications
            [application registerForRemoteNotificationTypes:
             (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound)];
        }
      

  4.   

    APNS 远程推送通知 PUSH deviceToken
      

  5.   

    模拟器?真机?模拟器是拿不到token的
      

  6.   

    这个问题我已解决
     
    方法: 
    1、(删除所有证书)命令行cd ~/Library/MobileDevice/Provisioning\ Profiles/     ,删除  rm *  
    2、 升级到xcode 7.2,然后用真机debug,注意一定要选择好描述文件,选对了就能对消息证书(测试的)
    进行测试,测试通过。
    3、发布在此选择新下载的发布证书(切忌一定要选对),然后打包发布绝对没问题 切忌一定要给分啊 ...........