Swift 如何正确获取用户坐标?

Swift 如何正确获取用户坐标?,swift,geolocation,gps,core-location,cllocation,Swift,Geolocation,Gps,Core Location,Cllocation,我制作了一个MapViewController采用CLLocationManagerDelegate协议,如下所示: extension MapViewController:CLLocationManagerDelegate{ func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { let usrLocation:CLLocatio

我制作了一个
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
        }
    }

userLocation
viewcontroller
类的成员,其值在
locationManager(\umanager:CLLocationManager,didUpdateLocations locations:[CLLocation])中设置。
。我是否应该将请求移动到此函数?如何在该上下文中检查用户状态?我只想请求授权应用程序检索其位置的用户。我希望解决方案不是一个计时器和多次检查,但任何帮助都是非常感谢的:-)

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


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

完全无关,在Swift中,您不需要或不想在
开关中的
案例中的
break
语句。在这种情况下,
.authorizedWhenInUse.authorizedAllways:
调用
管理器.requestLocation()
立即获取当前位置。@Rob:我也知道,但当我在官方文件中发现这一点时,我认为有些东西已经改变了:不,这里什么都没有改变。只是苹果方面的错误代码片段。只有空的
case
语句需要
break
..@Rob:好的,没问题Rob,我不能发布所有代码:当然,在其余代码中我启动定位服务。此外,只要加载我的viewController,就会调用didChangeAuthorization。您的建议的问题在于授权状态:授权用户必须发出请求,而其他用户必须发出另一个请求。如果我把请求放在“generic”didUpdateLocations中,我必须从那里检查用户状态(如何?),并有条件地在您的generic例程中发出请求,您只需进行一个测试,测试内容是“嘿,我是否已经发送了初始位置请求”,并相应地采取行动。通过一些ivar跟踪这一点。或者让一个
CLLocationManagerDelegate
用于此启动过程,另一个用于正在进行的请求。有很多方法。但是是的,
didUpdateLocations
是获取位置的地方。在代码中,我只知道我发送了一个位置请求,因为很久以前,在viewDidLoad主体中就已经完成了任何操作。所以,我想我应该检查didUpdateLocation中的authorizationStatus,但这会导致我重复didChangeAuthorization中的开关,这不是一个完全干燥的解决方案:-)也许ivar可以帮助也许我的问题是错误的:也就是说,请纠正我,如果我错了,未经授权的用户从未到达didUpdateLocations,只是因为他无法通过设计。这意味着只有授权用户才能访问它。因此,我的非泛型请求应该位于didUpdateLocations中,而泛型请求应该位于别处。不需要任何计算属性来检索用户的状态Yes,如果未授予授权,它显然不会调用带有位置的
didUpdateLocations
。。。
 <+0.00000000,+0.00000000> +/- 0.00m (speed -1.00 mps / course -1.00>