iOS 8 registerForRemoteNotifications 正确实现放置

iOS 8 registerForRemoteNotifications correct implementation placing

我见过很多不同的通知权限请求实现,但我仍然不知道哪一个是最好的。这可能是重复的,但我想要一个 2015 应该包含最新 Apple 推荐的答案。

我的一般问题是,是将 registerForRemoteNotifications 调用紧接在 registerUserNotificationSettings: 调用之前、紧接在它之后,还是放在它的 application:didRegisterUserNotificationSettings: 委托方法中。

目前,我是这样的:

[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
[[UIApplication sharedApplication] registerForRemoteNotifications];

并在设备上测试后 (这是第一次,因为用户对标准警报的响应令人讨厌地被缓存,即使在重新安装应用程序之后也是如此),我得到了这在控制台中:

2015-02-16 16:27:33.025 AppName[2679:591060] NOTIFICATIONS: didRegisterForRemoteNotificationsWithDeviceToken: <XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX>

然后 出现了 Apple 的标准警报,在选择 之后,我在控制台中得到了这些:

2015-02-16 16:32:26.631 AppName[2679:591060] NOTIFICATIONS: application:didRegisterUserNotificationSettings:: <UIUserNotificationSettings: 0x174634300; types: (UIUserNotificationTypeAlert UIUserNotificationTypeBadge UIUserNotificationTypeSound);>
2015-02-16 16:32:27.229 AppName[2679:591060] NOTIFICATIONS: didRegisterForRemoteNotificationsWithDeviceToken: <XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX> // same token

didRegisterForRemoteNotificationsWithDeviceToken: 代表在响应警报之前是如何被调用的?是不是因为两个电话是一个接一个?

更新:

我做了另一个测试,在标准警报中我选择了 No,我在控制台中得到了这些:

2015-02-16 16:54:37.472 AppName[2717:595759] NOTIFICATIONS: didRegisterForRemoteNotificationsWithDeviceToken: <XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX>
2015-02-16 16:54:44.353 AppName[2717:595759] NOTIFICATIONS: application:didRegisterUserNotificationSettings:: <UIUserNotificationSettings: 0x174432cc0; types: (none);>

所以 application:didFailToRegisterForRemoteNotificationsWithError: 从未调用过

这怎么可能?这与 Apple 的文档相反。

我通常将通知方法的注册放在应用程序委托的 applicationDidFinishLauching 中。我发布的代码片段适用于 iOS8 及更低版本。设置范围很广,如果你不是在寻找特定的定制,应该没问题。

if ([application respondsToSelector:@selector(isRegisteredForRemoteNotifications)])
{
    // iOS 8
    [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];

    [application registerForRemoteNotifications];
}
else
{
    // iOS < 8
    [application registerForRemoteNotificationTypes:
     (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound)];
}

一旦您成功获得您的令牌,您就可以将它发送到您的服务器。

My general question is whether to put the registerForRemoteNotifications call immediately before the registerUserNotificationSettings: call, immediately after it, or in it's application:didRegisterUserNotificationSettings: delegate method.

你答对了吗?我相信正确的位置是在应用程序委托中的 application:didRegisterUserNotificationSettings 中。从上面假设你想在你的视图控制器而不是应用程序委托中处理所有这些,在这个响应中使用 NSNotification 和对 registerForRemoteNotifications 的响应,并在你的视图控制器中放置一个相应的监听器。

- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
{
    if (notificationSettings.types != UIUserNotificationTypeNone) {
        //register to receive notifications
        [application registerForRemoteNotifications];
    } else {
        // same as response to didFailToRegisterForRemoteNotificationsWithError
        NSDictionary* data = [NSDictionary dictionaryWithObject:@"" forKey:@"deviceToken"];
        [[NSNotificationCenter defaultCenter] postNotificationName:@"notificationsRegistered" object:self userInfo:data];
    }
}