startMonitoringSignificantLocationChanges()在物理设备上不起作用

时间:2018-10-16 09:18:40

标签: swift cllocationmanager

当locationManager设置为startMonitoringSignificantLocationChanges()时,我无法在物理设备上显示位置。

一切都可以在Simulator中运行,但是当我在iPhone上运行它时,不会返回任何坐标,并且如果将其更改为startUpdatingLocation(),则可以在我的物理设备上运行。

有什么主意吗?

我的代码:

  let locationManager = CLLocationManager()
    override func viewDidLoad() {
        super.viewDidLoad()

        startReceivingSingificantLocationChanges()
    }

    func startReceivingSingificantLocationChanges() {

        if !CLLocationManager.significantLocationChangeMonitoringAvailable() {
            //the service is not available
            print("Service is not available")
            return
        }

        locationManager.delegate = self
        locationManager.requestWhenInUseAuthorization()
        locationManager.startMonitoringSignificantLocationChanges()
    }

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        if let location = locations.first{
            print(location.coordinate)
            coordinatesLbl.text = "LAT:\(location.coordinate.latitude) LONG:\(location.coordinate.longitude)"
        }
    }

    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
        if status == CLAuthorizationStatus.denied{
            showLocationDisabledPopUp()
            print("didChangeAuthorization")
        }
    }

2 个答案:

答案 0 :(得分:1)

startMonitoringSignificantLocationChanges()上的

The documentation状态:

  

只要设备从先前的通知移开500米或更多,应用程序就会收到通知。它不应期望通知的频率超过每五分钟一次。如果设备能够从网络检索数据,则位置管理器更有可能及时发送通知。

因此,使用此方法时,不要经常期望它们。

startUpdatingLocation更新的频率更高,这就是为什么这样做的原因。

答案 1 :(得分:1)

我已经尝试过了,并且遇到了同样的问题。我最终将位置desiredAccuracy设置为kCLLocationAccuracyKilometer。这具有给我带来显着位置变化的预期效果。完成此操作的另一种方法是使用startUpdatingLocation,一旦有了当前位置,就将位置管理器更改为startMonitoringSignificantLocationChanges