2

当应用程序需要注册推送通知(UIApplication registerForRemoteNotificationTypes)时,弹出窗口显示允许/不选择。

有没有办法跟踪用户何时做出此选择?

因为解决方案:

NSUInteger rntypes = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];

很好,但在用户触摸某些东西之前,默认情况下它是“否”。我应该只在用户做出选择后检查这个配置。

结果是在我的 EasyAPNS 服务器中,大多数应用程序都处于“禁用”模式,直到用户重新启动它们(因为第二次正确的配置将被推送到我的服务器)。因此,第一次启动时,可能不会考虑用户的真正选择(如果您真的很快接受,那么在我的应用程序注册到 EasyAPNS 之前,您的选择会在第一次启动时反映在服务器上)

任何想法 ?

4

2 回答 2

3

似乎无法确定是否已显示允许弹出窗口。我依靠用户默认值来跟踪这一点:

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    BOOL didRegisterForPush = [[NSUserDefaults standardUserDefaults] boolForKey:@"didRegisterForPush"];
    if (!didRegisterForPush) {
        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"didRegisterForPush"];
        [[NSUserDefaults standardUserDefaults] synchronize];
    }
    // .. send deviceToken to server
}

现在您可以使用以下方法确定授权状态:

- (PushAuthorizationStatus)pushAuthorizationStatus
{
    UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
    if (types) {
        return kPushAuthorizationStatusAuthorized;
    }
    BOOL didRegisterForPush = [[NSUserDefaults standardUserDefaults] boolForKey:@"didRegisterForPush"];
    if (didRegisterForPush) {
        return kPushAuthorizationStatusDenied;
    }
    return kPushAuthorizationStatusNotDetermined;
}

使用它,您可以将NotDetermined状态发送到服务器而不是Denied.

于 2012-09-26T10:03:13.987 回答
2

在 iOS 8 及更高版本下,该过程略有不同。在 iOS 8 中,该enabledRemoteNotificationTypes方法被替换为isRegisteredForRemoteNotifications.

但是,如果应用程序尝试注册通知,则 isRegisteredForRemoteNotifications 始终返回YES,无论用户是否实际允许它们。

要确定用户是否实际允许通知,请在此处使用@Lefteris 提供的函数:

- (BOOL)pushNotificationsEnabled {
    if ([[UIApplication sharedApplication] respondsToSelector:@selector(currentUserNotificationSettings)]) {
        UIUserNotificationType types = [[[UIApplication sharedApplication] currentUserNotificationSettings] types];
        return (types & UIUserNotificationTypeAlert);
    }
    else {
        UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
        return (types & UIRemoteNotificationTypeAlert);
    }
}
于 2015-10-14T20:48:25.387 回答