对于推送通知追踪用户选择[允许/不](track user choice for Push Noti

2019-07-31 22:50发布

当应用程序需要的推送通知登记(UIApplication的registerForRemoteNotificationTypes)的弹出显示允许/不要选择。

有没有一种方法来跟踪用户采取这种选择呢?

由于该解决方案:

NSUInteger rntypes = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];

是好的,但直到用户触摸的东西它在默认情况下是NO。 用户做出选择后,我才应选中此配置。

其结果是,在我的EasyAPNS服务器大多数应用程序都在“禁用”模式,直到用户重新启动他们(因为第二次的正确配置将被推到我的服务器)。 因此,与最早推出的用户真正的选择可能是不考虑(如果你真的接受很快,我的应用程序之前注册EasyAPNS那你的选择被反射回在首批推出的服务器上)

任何的想法 ?

Answer 1:

似乎有没有办法来确定是否允许弹出窗口已被证明。 我靠用户默认为跟踪此:

- (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



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


文章来源: track user choice for Push Notification [allow/don't]