iOS - 使用“设置”和“取消”按钮打开“位置服务” - “如何捕获取消”按钮单击

时间:2014-01-24 14:11:15

标签: ios cllocationmanager

当用户第一次启动应用程序并尝试登录时,系统会提示他们使用iOS对话框 - “打开位置服务”。

我需要在用户点击“取消”时捕获。是否发送了Notification?如果是这样,它的名字是什么?我一直无法找到它。

当位置服务被禁用或用户点击“不允许”时,CLAUthorizationStatuskCLAuthorizationDenied。当用户点击“取消”时,它不会触发authorizationChange事件。当用户点击“取消”时,应用程序就会挂起。

1 个答案:

答案 0 :(得分:14)

简短回答:你无法收到该通知。您可以使用CLLocationManager方法推断用户选择并采取相应措施(下面的答案较长)。

更长的答案:

首先,欢迎使用Stack Overflow。在善意提出问题并尝试与在场帮助的人合作之前,最好先搜索其他人之前提出的相同问题。

简短的搜索(仅提及其中一些):

现在,让我们尝试总结一下,从iOS文档开始:

  

如果您的应用依赖于位置服务来正常运行,您应该在应用的Info.plist文件中包含UIRequiredDeviceCapabilities键。您可以使用此密钥指定必须存在的位置服务,以便您的应用运行。 App Store使用此密钥中的信息阻止用户将应用程序下载到不包含列出功能的设备。

     

重要提示:如果您的应用使用了位置服务但能够在没有它们的情况下成功运行,请不要在UIRequiredDeviceCapabilities键中包含相应的字符串。

因此,如果您的应用确实需要访问用户的位置,则应将location-services并最终gps添加到UIRequiredDeviceCapabilities

然后,在代码中的某个位置 - 如果需要,您必须检查位置服务是否已启用。

[CLLocationManager locationServicesEnabled]

可能会因为三个原因而被禁止:

  • 用户可以在“设置”应用中停用位置服务。
  • 用户可以拒绝特定应用的位置服务。
  • 设备可能处于飞行模式,无法启动必要的硬件。

您对第二种情况感兴趣:用户拒绝允许您的应用使用位置服务。

再次,来自文档:

  

重要提示:除了硬件不可用外,用户还可以选择拒绝应用程序访问位置服务数据。在应用程序初次使用期间,Core Location框架会提示用户确认使用位置服务是可以接受的。如果用户拒绝该请求,则CLLocationManager对象会在将来的请求期间向其委托报告相应的错误。您还可以使用authorizationStatus方法检查应用程序的显式授权状态。

[CLLocationManager authorizationStatus]

可能会返回:

  • kCLAuthorizationStatusNotDetermined如果用户尚未选择此应用程序是否可以使用位置服务。
  • kCLAuthorizationStatusRestricted此应用程序无权使用位置服务。用户无法更改此应用程序的状态,可能是由于父母控制等主动限制。
  • kCLAuthorizationStatusDenied用户明确拒绝为此应用程序使用位置服务,或者当前在“设置”中禁用了位置服务。
  • kCLAuthorizationStatusAuthorized此应用程序有权使用位置服务。

如果[CLLocationManager locationServicesEnabled]返回NO并且您无论如何都尝试启动位置服务(即呼叫[locationManager startUpdatingLocation]),系统会提示用户确认是否应重新启用位置服务。鉴于位置服务很可能是故意禁用的,用户可能不欢迎此提示。

我想你知道,并完成了之前的所有步骤(我只确定你已经检查了authorizationStatus)。你拒绝向我们展示你的应用程序的重要代码所以我只能假设背后的整体逻辑。现在你说你的应用程序挂了。这应该是因为你没有正确捕捉错误?如果您愿意,捕获错误是重新提示用户的方法。

致电[locationManager startUpdatingLocation]后,如果未获得授权,您的代理人应定义locationManager:didFailWithError:以便抓住kCLErrorDenied

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error

此时,您可以显示UIAlert坚持要求用户授予您访问其位置的权限,或触发用户界面中的更改或您喜欢的任何内容。

<小时/> 最终说明

我希望您理解我为什么要求代码:原因是为您提供替代解决方案而不是回复“您无法捕获'取消'通知”。

如果这个答案不能满足您的问题,请详细说明为什么需要按下“取消”/“不允许”按钮,这样我们就可以提供替代方案。

显然,我的建议是,如果他们不想要的话,不断要求他们提供定位服务,以免惹恼他人。

Post scriptum:如果不是全部的话,也许答案在某些部分看起来很迂腐和明显,但我们也在这里为未来的读者提供答案。