跟踪推送通知的用户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
方法被isRegisteredForRemoteNotifications
replace。
但是,如果应用程序尝试注册通知,则无论用户是否真的允许,都会返回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); } }