跟踪推送通知的用户select

当一个应用程序需要注册推送通知(UIApplication registerForRemoteNotificationTypes)时,一个popup窗口显示允许/不select。

有什么方法可以跟踪用户何时进行此select?

因为解决scheme:

NSUInteger rntypes = [[UIApplication sharedApplication] enabledRemoteNotificationTypes]; 

是好的,但直到用户触摸的东西是默认的NO。 用户做出select ,我只应该检查这个configuration。

其结果是,在我的EasyAPNS服务器中,大部分应用程序处于“禁用”模式,直到用户重新启动它们(因为第二次正确的configuration将被推送到我的服务器)。 因此,在第一次启动时,用户的实际select可能不被考虑(如果您确实快速接受,那么在我的应用程序注册到EasyAPNS之前,您的select将在首次启动时反映回服务器上)

任何想法 ?

似乎没有办法确定是否显示允许popup窗口。 我依靠用户的默认值来跟踪这个:

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

在iOS 8和更高版本中,该过程有点不同。 在iOS 8中, enabledRemoteNotificationTypes方法被isRegisteredForRemoteNotificationsreplace。

但是,如果应用程序尝试注册通知,则无论用户是否真的允许,都会返回YES isRegisteredForRemoteNotifications YES

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

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