iOS9 NSDefaultRunLoopMode不会侦听didRegisterForRemoteNotificationsWithDeviceToken委托

时间:2015-07-29 06:44:10

标签: objective-c push-notification apple-push-notifications nsrunloop runloop

在iOS 9中

[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:timeoutDate];

不会听取didRegisterForRemoteNotificationsWithDeviceTokendidFailToRegisterForRemoteNotificationsWithError委托,但会听取applicationDidEnterBackground和其他UIApplication代表的意见。它适用于iOS 7和iOS 8。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
   [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
   [[UIApplication sharedApplication] registerForRemoteNotifications];

   dispatch_async(dispatch_get_main_queue(), ^{
        [self waitForCompletion:30];
   });
  return YES;
}

- (bool)waitForCompletion:(NSTimeInterval)timeoutSecs {
   NSDate *timeoutDate = [NSDate dateWithTimeIntervalSinceNow:timeoutSecs];
   do {
    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:timeoutDate];
    if ([timeoutDate timeIntervalSinceNow] < 0.0)
        break;
   } while (!_done);
   return _done;
}

- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken {
   // send device token to server
   _done = true;
}

application:didRegisterForRemoteNotificationsWithDeviceToken总是在30秒后调用(超时值)。

0 个答案:

没有答案