CLLocationManager实例方法不会强制位置服务多次打开

时间:2019-03-09 16:42:23

标签: ios swift location-services

我正在使用requestWhenInUseAuthorization()类的实例方法CLLocationManager来强制警报消息Turn On Location Services to Allow "myApp" to Determine Your Location在用户第一次选择Cancel之后第二次出现但是警报消息不再出现。谁能解释我的代码在哪里出问题了?谢谢。

我在UITableViewController的一个自定义子类中具有以下代码;

if (CLLocationManager.locationServicesEnabled() == false) || (CLLocationManager.authorizationStatus() != .authorizedWhenInUse)
{

    self.navigationController!.popViewController(animated: true)

}

应强制UITableViewController的另一个自定义子类实例的前一个实例在下面的viewDidAppear()方法中再次显示其视图;

    override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(true)

    // prompts user to turn on location services
    locationManager.requestWhenInUseAuthorization()

}

,但不会导致警报消息再次显示给用户。 UITableViewController的两个自定义子类实例都嵌入到我的故事板文件的UINavigationController实例中。

2 个答案:

答案 0 :(得分:1)

只能向用户请求一次使用位置服务的许可。如果用户拒绝,则无法再次提示他们。来自requestWhenInUseAuthorization()的{​​{3}}:

  

当前授权状态为notDetermined时,此方法异步运行,并提示用户向应用授予使用位置服务的权限。

     

...

     

如果当前授权状态不是notDetermined,则此方法不执行任何操作,并且不会调用locationManager(_:didChangeAuthorization:)方法。

要让用户拒绝后授予您的应用程序位置权限,他们需要转到设备上的“设置”应用程序,找到您的应用程序,然后在此处启用“位置”权限。通过打开the documentation,在您的应用程序中提供指向此设置页面的链接,可以使用户更容易做到这一点。

如果还没有,请查看《人机界面指南》的UIApplicationOpenSettingsURLString URL部分,以获取有关此方面的最佳实践。

答案 1 :(得分:0)

您不需要系统警报。 可以通过调用(等待)locationServicesEnabled()来确定是否启用了位置服务。然后可以显示一个警报,请求用户将其打开。