无法获得权限提示

时间:2014-12-17 16:09:03

标签: ios objective-c uilocalnotification

解决方法在下面作为答案发布,我已经得出结论,这是一个iOS 8-8.1 +错误,据我所知还没有解决。

原帖:

我不知所措,这之前有效,但经过我的应用程序的许多更改和更新后,它不再有效,我不是100%确定是否是由于iOS 8或我的应用程序,因为这个应用程序已经WIP很长一段时间。

如果我(用户)想要允许来自我的应用的通知,则不会收到提示。

更新:我在另一台设备(iPhone 5,iOS 8.1.2)上测试了我的应用程序并成功申请了许可,但它仍无法在我的设备上运行(iPhone 6 +,iOS 8.0)。

(为清晰起见编辑:该测试是iPhone 5,iOS 8.1.2上首次安装该应用程序,并且在更新2中所述的iPhone 5上重新安装时仍然存在此问题。)

更新2:当我从第二台设备(Update1:​​iPhone 5)卸载应用程序时,它从未提示我再次获得通知权限,但它仍然有效,并且日志还显示设置的权限。但它仍然提示用户获得位置许可。

错误:

2014-12-17 09:49:51.852 Attempting to schedule a local notification  <UIConcreteLocalNotification: 0x170344620>{fire date = (null), time zone = (null), repeat interval = 0, repeat count = UILocalNotificationInfiniteRepeatCount, next fire date = Wednesday, December 17, 2014 at 9:49:51 AM Central Standard Time, user info = (null)} with an alert but haven't received permission from the user to display alerts

2014-12-17 09:49:51.853 Attempting to schedule a local notification <UIConcreteLocalNotification: 0x170344620>{fire date = (null), time zone = (null), repeat interval = 0, repeat count = UILocalNotificationInfiniteRepeatCount, next fire date = Wednesday, December 17, 2014 at 9:49:51 AM Central Standard Time, user info = (null)} with a sound but haven't received permission from the user to play sounds

我曾经使用过的代码很好:

AppDelegate:didFinishLaunchingWithOptions

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) {
    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
    [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
}

我尝试过的代码:

if ([UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings:)]){
    [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound categories:nil]];
}

[application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound categories:nil]];

&安培;

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) {
    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
    [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
}

&安培;

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
{
    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIRemoteNotificationTypeBadge
                                                                                         |UIRemoteNotificationTypeSound|UIRemoteNotificationTypeAlert) categories:nil];
    [application registerUserNotificationSettings:settings];

    NSLog(@"current notifications : %@", [application currentUserNotificationSettings]);

    [application registerForRemoteNotifications];
}
else
{
    [application registerForRemoteNotificationTypes:
     (UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert)];
}

我已经在AppDelegate:didFinishLaunchingWithOptions和IBAction上的FirstViewController中分别和一起尝试了所有这些(当然用[UIApplication sharedApplication]替换应用程序)

尝试设置权限后,我尝试检查NSLog:

NSLog(@"current notifications : %@", [[UIApplication sharedApplication] currentUserNotificationSettings]);

的NSLog:

current notifications : <UIUserNotificationSettings: 0x170435ee0; types: (none);>

在我的应用程序中,我要求允许使用他们的位置,并且在询问他们的位置之前和之后尝试询问通知许可,并且没有任何区别。

有效的位置许可代码..

self.locationManager = [[CLLocationManager alloc] init];
if([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
    [self.locationManager requestAlwaysAuthorization];
}

2 个答案:

答案 0 :(得分:2)

我在许多设备的许多测试结束后得出结论,这个问题与iOS 8有关。在我测试之后,我没有注意到要在8.0或8.1中修复此问题。我还没有测试过所有版本,所以不知道这个bug是否还在发生。我找到了一个解决方法,说明如下。

解决方法:

用户(又名你)可以做些什么来解决不提示显示UILocalNotifications权限的问题,允许应用程序手动显示通知。

注意: *每次卸载并重新安装应用程序时,都需要重复此操作。 *

转到:

Settings > Notifications

在列表中找到您的应用并选择它。它们将是允许应用程序设置的设置,不允许使用通知。确保切换“允许通知”切换,并根据需要进行其他设置。

开发人员警告:

当开发人员允许应用程序在第一次测试中获取通知时,这个错误可能会被忽视,除非完全是一个新设备,否则永远不会再次提示,所以如果一个开发者在苹果提示时不允许通知一开始你不能得到重新诠释。无论您是否批准该权限或拒绝,相同的错误仍然适用,您只会在设备上收到一次提示,删除并重新安装不会重新提示您。

在我的情况下:

在我测试期间,我必须按下“不允许”,对于“通知”权限以及iOS 8中的错误,它会永久保留,并且不会再次提示我进行许可。然后我去了设置&gt;通知并注意到我的应用程序列在“请勿包含”下,然后我从设置中选择了我的应用并启用了它们。

答案 1 :(得分:2)

应用应始终检查权限状态:

let settings = UIApplication.sharedApplication().currentUserNotificationSettings()

当应用程序意识到我们没有权限时,它应该提供一个警报提供直接用户直接到设置应用中的正确位置。如果用户接受,则运行此代码(这是Swift但我确定您可以翻译):

let url = NSURL(string:UIApplicationOpenSettingsURLString)!
UIApplication.sharedApplication().openURL(url)

这是一个新的iOS 8功能。