CLLocationManager获取位置的速度很慢,Swift

ercv8c1e  于 2023-02-03  发布在  Swift
关注(0)|答案(4)|浏览(271)

我正在创建这个应用程序,它需要获得用户的位置-它的所有工作正常,问题是,从接受使用位置服务的时间,以获得实际的位置需要5秒-这是正常的吗?我用过其他应用程序,在那里它走得更快。
下面是我的代码:

override func viewDidLoad() {
    super.viewDidLoad()

    // Ask for Location-Authorisation from the User.
    self.locationManager.requestWhenInUseAuthorization()

    if CLLocationManager.locationServicesEnabled() {
        locationManager.delegate = self
        locationManager.requestLocation()
    }

    mapView.delegate = self

}


func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    let locValue: CLLocationCoordinate2D = manager.location!.coordinate

    let initialLocation = CLLocation(latitude: locValue.latitude, longitude: locValue.longitude)

    self.centerMapOnLocation(initialLocation)
}

func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
    print("could not get location")
}

但是从应用程序获取位置到centerMapOnLocation-function的时间似乎很长。当获取用户位置时,应该预期什么?我正在测试wifi连接,所以我知道这不是因为互联网很慢,或者连接不好...
有人有主意吗?:)
最好的问候!

mrphzbgm

mrphzbgm1#

尝试设置准确性并使用locationManager.startUpdatingLocation()。我这样做了,并在一秒钟内得到答案(在设备上)。

bnl4lu3b

bnl4lu3b2#

来自**requestLocation()的文档:
此方法立即返回。调用它会导致位置管理器获取位置修复
(可能需要几秒钟)**并使用结果调用委托的locationManager(_:didUpdateLocations:)方法。
Source
所以基本上,你的代码一切都很好,只是框架是如何构建的。

vsikbqxv

vsikbqxv3#

初始化位置管理器时,添加startUpdatingLocation():

let manager = CLLocationManager()
 manager.delegate = self
 manager.requestWhenInUseAuthorization()
 manager.requestLocation()
 manager.startUpdatingLocation()

如果没有**startUpdatingLocation(),**geo-location大约需要5秒,如果有,请求几乎立即执行。

wi3ka0sx

wi3ka0sx4#

如果您不想因位置管理器而延迟应用的启动,请考虑部署两个位置管理器(在应用代理中),一个负责快速生成位置,另一个负责准确生成位置:

fastLoc.delegate = self
fastLoc.desiredAccuracy = kCLLocationAccuracyThreeKilometers
fastLoc.requestWhenInUseAuthorization()
fastLoc.startUpdatingLocation()

bestLoc.delegate = self
bestLoc.desiredAccuracy = kCLLocationAccuracyBest
bestLoc.requestWhenInUseAuthorization()
bestLoc.requestLocation()

3 km精度与startUpdatingLocation()的组合应该几乎立即返回位置,几乎总是在根视图控制器准备就绪之前返回。bestLoc管理器很可能在用户启动应用后很久才返回位置,但它会非常准确。

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    switch manager {
    case fastLoc:
        fastLoc.stopUpdatingLocation()
        deviceLocation = locations.last! // set property with fast loc
        
    case bestLoc:
        deviceLocation = locations.last! // overwrite property with best loc
    default:
        break
    }
}

相关问题