2012-09-26 163 views
2

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

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

由于该解决方案:

NSUInteger rntypes = [[UIApplication sharedApplication] enabledRemoteNotificationTypes]; 

是好的,但直到用户触摸的东西它在默认情况下是NO。我只能在之后检查此配置用户做出选择。

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

任何想法?

回答

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

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); 
    } 
} 
+1

'isRegisteredForRemoteNotifications'并不总是返回'YES'。返回:如果应用程序注册了远程通知并收到其设备令牌,则为YES;如果注册尚未发生,失败或被用户拒绝,则返回NO。 – Jon

相关问题