当应用程序需要注册推送通知(UIApplication registerForRemoteNotificationTypes)时,弹出窗口显示允许/不选择。
当用户选择时,有没有办法跟踪?
因为解决方案:
NSUInteger rntypes = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
很好,但是在用户触摸某些内容之前,它默认为NO。我应该在用户做出选择之后检查此配置。
结果是,在我的EasyAPNS服务器中,大多数应用程序都处于“禁用”模式,直到用户重新启动它们(因为第二次将正确的配置推送到我的服务器)。因此,第一次启动时,用户的真正选择可能不会被考虑在内(如果您真的很快接受,在我的应用程序注册到EasyAPNS之前,您的选择会在首次启动时反映在服务器上)
有什么想法吗?
答案 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);
}
}