在模拟器中,此方法仅执行一次。
但是,当使用真实手机进行测试时,它会在同一位置运行多次。
我想控制这种方法的频率。
或者是否可以通过distanceFilter?
如果可能,我该怎么办?
我怀疑只要位置发生变化,locationManager(_:didUpdateLocations :)方法就会自动运行,所以我无法控制它。
有办法吗?
import UIKit
import CoreLocation
class MainViewController: UIViewController, CLLocationManagerDelegate {
let locationManager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
locationManager.delegate = self
locationManager.requestAlwaysAuthorization()
locationManager.startUpdatingLocation()
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
// my source code
}
}
不要使用自iOS 6以来已弃用的func locationManager(_ manager: CLLocationManager, didUpdateTo newLocation: CLLocation, from oldLocation: CLLocation)
函数。
设置所需的精度应该可以解决以相对相同的点获得许多更新的问题。对于精度稍低的跟踪,可以试试
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
如果您关注长时间运行的跟踪任务/作业,请考虑实施
func locationManagerDidPauseLocationUpdates(CLLocationManager)
func locationManagerDidResumeLocationUpdates(CLLocationManager)
他们会通知您位置没有变化,为了节省电力,设备将关闭一些硬件。
您可以设置位置准确度
self. locationManager.desiredAccuracy = kCLLocationAccuracyBest
见https://developer.apple.com/documentation/corelocation/cllocationaccuracy
我不确定你能控制它。你可以使用func locationManager(_ manager: CLLocationManager, didUpdateTo newLocation: CLLocation, from oldLocation: CLLocation) { }
方法。此方法为您提供最后位置和新位置,并代表这些位置,您可以执行所需的功能。
或者你可以参考这个答案click here
位置不随模拟器而变化。你只能从didupdatelocations回调中获得一个调用。在真实设备上运行将导致完成处理程序不断触发。您可以使用GPX文件模拟一个位置,但我不相信它一旦使用模拟器就会激发更多。
期望的准确度确实会改变发射频率,但频率也取决于GPS硬件和电池寿命状态。 iOS控制频率到一定程度,以优化设备性能和使用寿命