跟踪推送通知的用户选择[允许/不要]

时间:2012-09-26 09:46:48

标签: ios cocoa-touch push-notification

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

当用户选择时,有没有办法跟踪

因为解决方案:

NSUInteger rntypes = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];

很好,但是在用户触摸某些内容之前,它默认为NO。我应该在用户做出选择之后检查此配置

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

有什么想法吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

在iOS 8及更高版本中,程序略有不同。在iOS 8中,enabledRemoteNotificationTypes方法已被isRegisteredForRemoteNotifications取代。

但是 isRegisteredForRemoteNotifications 总是会返回YES ,如果应用尝试注册通知,无论用户是否实际允许通知。

要确定用户是否实际允许通知,请使用@Lefteris here提供的功能:

- (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);
    }
}