在 iOS 的 Swift 中使用“locations array”或“manager.location.coordinate”哪一个来获取用户位置?

Posted

技术标签:

【中文标题】在 iOS 的 Swift 中使用“locations array”或“manager.location.coordinate”哪一个来获取用户位置?【英文标题】:Which one to use "locations array" or "manager.location.coordinate" in Swift in iOS to get user location? 【发布时间】:2016-10-20 05:06:25 【问题描述】:

我想获取用户的位置。这可能是大概的位置,这很好。 在didUpdateLocations 方法中,我看到了两种获取坐标的方法。

    使用manager.location.coordinate 使用locations数组

我应该选择哪一个?我认为位置数组将包含用户最近的位置,因为我在用户打开应用程序后立即开始 startUpdatingLocation()

那么我应该使用哪一个来获取坐标?在这种情况下manager.location.coordinate 做了什么?

注意:定位精度不必精确到 10 米。粗略估计就够了。

这是我的代码:

func initLocationUpdates() 
    if CLLocationManager.locationServicesEnabled() 
        print("going to get location")
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
        locationManager.startUpdatingLocation()
    
    else 
        print("location services disabled")
    


func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) 
    let locValue:CLLocationCoordinate2D = manager.location!.coordinate
    print("locations = \(locValue.latitude) \(locValue.longitude)")

    /*
    let userLocation:CLLocation = locations[0]  // or maybe even locations.last
    let long = userLocation.coordinate.longitude;
    let lat = userLocation.coordinate.latitude;
    print("lat: ", lat, " --- long: ", long)
    */

    locationManager.stopUpdatingLocation()

【问题讨论】:

【参考方案1】:

我更喜欢数组而不是实例变量,因为 desiredAccuracy 的工作方式 - 它不能保证您收到的位置更新将具有您要求的准确性 - 只是系统会尽最大努力提供他们。根据位置管理器的行为方式,您可能会在 locations 数组中获得许多更新,这些更新具有不同的准确度。然后,您可以过滤数组以找到最准确的数组。

关键点是,如果多个更新到达同一个didUpdateLocations: 调用,而您只使用manager.location,您可能会错过更新。丢失的更新肯定不是最新的,但它可能是迄今为止收到的最准确的更新。

由于您已将 desiredAccuracy 设置为非常高的水平(十米),我猜对您来说,精度比时间更重要 - 系统需要一段时间才能提供该精度水平的更新(如果您在室内或无法使用 GPS,它可能永远不会到达)。因此,上述情况发生的可能性是合理的。

至于实例变量location的用途,docs表明它打算在应用重启时的某些情况下使用:

ios 4.0 及更高版本中,此属性可能在启动时包含更新的位置对象。具体来说,如果正在运行重要的位置更新并且您的应用程序已终止,则此属性会在您的应用程序重新启动时使用最新的位置数据进行更新(并且您会创建一个新的位置管理器对象)。此位置数据可能比您的应用处理的最后一个位置事件更新。

【讨论】:

在这种情况下,您应该将 desiredAccuracy 设置为较低的精度 答案还是一样——使用位置数组

以上是关于在 iOS 的 Swift 中使用“locations array”或“manager.location.coordinate”哪一个来获取用户位置?的主要内容,如果未能解决你的问题,请参考以下文章

“无效的 Swift 支持”在 Xamarin.iOS 中使用本机 Swift 库

iOS - 如何在 swift 中使用`NSMutableString`

如何在 Flutter 插件的 Swift 编写的 iOS 部分中使用 Objective-C 框架

使用swift在ios的Uiwebview中添加参数

在 iOS (Swift) 中使用后台位置更新的最佳方式 [关闭]

为啥应用存档在 iOS、swift、xcode 9.2 中使用自定义框架失败