iOS不可靠的位置权限警报

时间:2017-02-22 08:17:40

标签: ios cocoa-touch permissions geolocation alert

在我们的应用中,我们要求在一个用于显示地图的视图上获得位置许可(WhenInUse)。

如果用户选择禁用设备位置服务(即在设备设置中全局禁用),然后在应用中打开我们的视图,则会显示位置权限弹出窗口。重复冲洗几次(重新打开服务,继续使用应用程序,离开应用程序,关闭服务等),几次后,位置许可警报将停止显示。

任何人都知道这是否是iOS中的错误(在iOS 10上发生)?

我们可以使用我们自己的警告显示何时

CLLocationManager locationServicesEnabled = NO

但由于我们无法控制是否/何时弹出iOS位置警报,因此有时会发生这两种情况,即它们同时显示的是不良用户体验。

任何已知的问题解决方案?我必须向我们的QA和经理解释这是否是iOS中的错误。

编辑:

- (BOOL)negotiateLocationServicePermission:(UIViewController *)context
{
    /* Device location service is enabled. */
    if ([CLLocationManager locationServicesEnabled])
    {
        /* App location service is already authorized. */
        if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorizedWhenInUse
            || [CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorizedAlways)
        {
            /* App location service is authorized. Start location updates ... */
            [self startUpdatingLocation];
            return YES;
        }
        else
        {
            /* App location service not yet authorized and status is not determined (aka: first time asking for permission). */
            if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined)
            {
                /* Request the location permission from the user. */
                if ([self respondsToSelector:@selector(requestWhenInUseAuthorization)])
                    [self requestWhenInUseAuthorization]; /* iOS 8+ */
                else
                    [self startUpdatingLocation]; /* iOS 7 */
                return YES;
            }
            /* App location service not authorized and previously denied. */
            else
            {
                /* App location service permission was denied before. */
                // Show custom alert!
                return NO;
            }
        }
    }
    /* Device location service is disabled. */
    else
    {
        // Show custom alert!
        return NO;
    }
}

2 个答案:

答案 0 :(得分:0)

我不认为这是一个bug,这是不同的AlertView。

如果用户接受了一次位置许可,则会保存,不会再次询问他。但是,如果禁用位置服务,则这是一种不同的情况。

您可以这样实现:

if ([CLLocationManager locationServicesEnabled]){

    NSLog(@"Location Services Enabled");

    if ([CLLocationManager authorizationStatus]==kCLAuthorizationStatusDenied){
        alert = [[UIAlertView alloc] initWithTitle:@"App Permission Denied"     
                                           message:@"To re-enable, please go to Settings and turn on Location Service for this app." 
                                          delegate:nil 
                                 cancelButtonTitle:@"OK" 
                                 otherButtonTitles:nil];
        [alert show];
    }
}

因此,如果用户从“设置”中禁用位置服务,则警报视图可以重定向到“设置”页面。

这样多个AlertViews就不会出现了。这取决于您希望如何处理每种情况:

  • 在“设置”中启用了位置服务,但此应用程序的权限被拒绝
  • 在“设置和授权权限”中启用了位置服务
  • 在设置
  • 中停用了位置服务

确保你处理每一个案件,并进行测试。

我不知道我是否准确回答了你的问题,我希望这对你的实施有所帮助。

答案 1 :(得分:0)

如果我没记错的话,只有在authorizationStatusundetermined时才会发出iOS对话框。 如果状态为denied(仅当特定应用被拒绝或整个位置服务被禁用时),您需要发布自己的对话框,其中包含指向设置的深层链接