当应用程序需要的推送通知登记(UIApplication的registerForRemoteNotificationTypes)的弹出显示允许/不要选择。
有没有一种方法来跟踪当用户采取这种选择呢?
由于该解决方案:
NSUInteger rntypes = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
是好的,但直到用户触摸的东西它在默认情况下是NO。 用户做出选择后,我才应选中此配置。
其结果是,在我的EasyAPNS服务器大多数应用程序都在“禁用”模式,直到用户重新启动他们(因为第二次的正确配置将被推到我的服务器)。 因此,与最早推出的用户真正的选择可能是不考虑(如果你真的接受很快,我的应用程序之前注册EasyAPNS那你的选择被反射回在首批推出的服务器上)
任何的想法 ?
似乎有没有办法来确定是否允许弹出窗口已被证明。 我靠用户默认为跟踪此:
- (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
。
然而 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);
}
}