【问题标题】:How to properly get user coordinates?如何正确获取用户坐标?
【发布时间】:2019-06-15 04:00:49
【问题描述】:

我通过这种方式使MapViewController采用CLLocationManagerDelegate协议:

extension MapViewController:CLLocationManagerDelegate{

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

        let usrLocation:CLLocation = locations[0] as CLLocation

        // readable
        print("lat = \(usrLocation.coordinate.latitude)")
        print("lon = \(usrLocation.coordinate.longitude)")

        self.userLocation = usrLocation

        locationManager.stopUpdatingLocation()

    }

    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error)
    {
        print("Error \(error)")
    }

    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {

        switch status {
        case .restricted, .denied, .notDetermined:

            // no issue here because I make a very generic request to a server
            // AND I don't need user coordinates

            break

        case .authorizedWhenInUse, .authorizedAlways:

            // here I need user coordinates because I need to request content to a server
            // based on user coordinates but when I check for userLocation
            // at first I find <+0.00000000,+0.00000000> +/- 0.00m (speed -1.00 mps / course -1.00

            print("----------------")
            print(userLocation)
            print("----------------")

            break
        }
    }

我需要.authorizedWhenInUse/.autorizeAlways 案例正文中的用户位置数据,因为我需要发送当前 用户坐标到服务器。问题是当我需要它们时,我首先得到了一个像这样的用户位置:

 <+0.00000000,+0.00000000> +/- 0.00m (speed -1.00 mps / course -1.00>

userLocationviewcontroller 类的成员,其值设置在locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) 中。我应该将请求移至此功能吗?以及如何在这种情况下检查用户状态?我只想向授权该应用程序检索其职位的用户提出请求。我希望解决方案不是计时器和多次检查,但感谢您提供任何帮助:-)

【问题讨论】:

  • 完全不相关,在 Swift 中,您不需要或不希望 case 语句中的 break 语句在 switch 中。
  • 在这种情况下.authorizedWhenInUse, .authorizedAlways: 调用manager.requestLocation() 以立即获取当前位置。
  • @Rob:我也知道,但是当我在官方文档中发现这一点时,我认为发生了一些变化:developer.apple.com/documentation/corelocation/…
  • 不,这里没有任何变化。只是 Apple 的错误代码 sn-p。只有空的case 语句需要break...
  • @Rob:好的,没问题

标签: swift geolocation gps core-location cllocation


【解决方案1】:

仅仅因为您收到了.authorizedWhenInUse.authorizedAlways 并不意味着您已经启动了定位服务。这只是意味着它已被授权。您不应该尝试在 didChangeAuthorization 中检索用户位置。

因此,您应该调用startUpdatingLocation 并将用于将此位置发送到服务器的代码移动到您的didUpdateLocations 方法。

【讨论】:

  • Rob,我无法发布所有代码:当然,在其余代码中我启动了定位服务。此外,只要我的 viewController 加载,就会调用 didChangeAuthorization。您的建议的问题是授权状态:授权用户必须提出请求,而其他用户必须提出另一个请求。如果我将请求放在“通用”didUpdateLocations 中,我必须从那里检查用户状态(如何?)并有条件地提出我的请求
  • 在您的通用例程中,您只需进行一个测试,显示“嘿,我是否已经发送了初始位置请求”,然后采取相应的行动。通过一些 ivar 跟踪这一点。或者有一个CLLocationManagerDelegate 用于此启动过程,另一个用于正在进行的请求。很多方法可以做到。但是,是的,didUpdateLocations 是您获取位置的地方。
  • 在代码中我只知道我发送了一个位置请求,因为很久以前在 viewDidLoad 正文中完成了任何事情。所以,我想我应该检查 didUpdateLocation 中的 authorizationStatus,但这会导致我重复我在 didChangeAuthorization 中的切换,这不完全是 DRY 解决方案 :-) 也许 ivar 可以提供帮助
  • 也许我的问题是错误的:也就是说,请纠正我,如果我错了,未经授权的用户永远不会到达 didUpdateLocations,只是因为他无法通过设计。这意味着只有授权用户才能访问它。所以,我的非通用请求应该存在于 didUpdateLocations 中,而通用请求应该存在于其他地方。不需要任何计算属性来检索用户的状态
  • 是的,如果没有授权,它显然不会调用didUpdateLocations的位置...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-12
  • 1970-01-01
  • 1970-01-01
  • 2014-10-22
  • 1970-01-01
相关资源
最近更新 更多