2011-05-06 54 views
7

当我们在应用程序中使用位置服务时,我们收到一个iOS警报,说应用程序正在尝试使用当前位置 - 允许/不允许。位置服务iOS警报回调

我们是否有这些按钮的代表回拨?

我想处理点击“不允许”。

回答

15

您无法直接访问该警报。

如果用户按下“不允许”,或者如果该应用程序无权使用位置服务,则CLLocationManager将在其代表上呼叫locationManager:didFailWithError:。错误域将为kCLErrorDomain,错误代码为kCLErrorDenied

+0

这是一个很好的提示,但我发现在我得到这个回调之前显示了警报,甚至是didChangeAuthorizationStatus回调。还有什么我可以做的吗? – elsurudo 2012-08-20 18:52:12

+0

@elsurudo,你现在可能已经想通了,但是对于记录来说,只要在CLLocationManager上启动位置更新,Apple就会显示该警报。如果您想直观地告诉用户为什么您要让系统请求他们的位置,则需要为此创建自己的用户界面,并避免启动位置管理器,直到确定用户已轻按或滑动你的UI。 – clozach 2013-02-01 01:40:23

3

在启动位置管理器之前,您还应该检查用户是否允许为您的应用提供位置服务。使用CLLocationManager类方法locationServicesEnabled进行检查。

这里的DOC:

locationServicesEnabled

返回一个布尔值指示是否位置服务在设备上启用。

+ (BOOL)locationServicesEnabled

返回值 是如果位置服务启用或NO,如果他们不。

讨论 用户可以通过切换设置>常规>位置服务中的开关,从“设置”应用程序完全启用或禁用位置服务。

您应该在开始位置更新之前检查此方法的返回值,以确定用户是否为当前设备启用了位置服务。如果此方法返回NO,并且始终启动位置更新,则Core Location框架会提示用户使用确认面板询问是否应重新启用位置服务。

+0

这有点危险,因为这会确定位置服务是打开还是关闭,所以用户可以打开定位服务,但是专门关闭您的应用。 – RickiG 2011-08-01 16:58:27

+0

这并不危险,事实上Apple建议在启动位置管理器之前检查位置服务是否已启用(请参阅文档中的LocateMe示例代码)。这是首先要检查的。您还应该在代理中检查kCLErrorDenied。 – 2011-08-01 20:44:46

+0

我有点含糊,对不起。我的意思是不仅仅依赖于[CLLocationManager locationServicesEnabled],因为用户可能通常打开位置服务,但是关闭您的应用:) – RickiG 2011-08-02 09:41:05

6

你可以简单地得到行动选择如下图所示:

- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status { 
    if (status == kCLAuthorizationStatusAuthorizedAlways || status == kCLAuthorizationStatusAuthorizedWhenInUse) { 
     [self addRegion]; 
    } 
    else if (status == kCLAuthorizationStatusDenied) { 
     NSLog(@"Location access denied"); 
    } 
} 

确保设置位置管理的委托。

+2

谢谢完美的解决方案.. – 2015-12-08 09:38:22