Как отследить в фоновом режиме в iOS ходьбы пользователя и рассчитать пройденное расстояние с помощью Swift и Xcode? - PullRequest
0 голосов
/ 05 марта 2020

Как отследить в фоновом режиме в iOS пользователя, идущего в Apple MapKit или Google Maps Platform для iOS, и рассчитать пройденное расстояние с помощью Swift и Xcode?

Я пытался использовать MapKit. Проблема, которую я получаю, заключается в том, что, когда устройство iOS заблокировано, Базовое местоположение перестает отслеживать устройство. Когда устройство разблокировано и приложение выходит на передний план, Базовое местоположение снова начинает отслеживание и dr aws прямая линия от последней отслеживаемой точки до точки, отслеживаемой, когда приложение выходит на передний план, таким образом пропуская все время, пока устройство заблокировано. Если Google Maps Platform работает лучше для этой цели, я готов ее использовать.

Ниже приведен соответствующий код:

override func viewDidLoad() {
    super.viewDidLoad()

    locationManager.delegate = self
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.distanceFilter = kCLDistanceFilterNone
    locationManager.allowsBackgroundLocationUpdates = true
    if #available(iOS 11.0, *) {
        locationManager.showsBackgroundLocationIndicator = true
    }

    let status = CLLocationManager.authorizationStatus()

    if status == .authorizedAlways || status == .authorizedWhenInUse || status == .restricted {

        locationManager.startUpdatingLocation()
        locationManager.startMonitoringSignificantLocationChanges()

    } else {

        locationManager.requestAlwaysAuthorization()

    }

}

func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {

    if status == .authorizedAlways || status == .authorizedWhenInUse || status == .restricted {

        locationManager.startUpdatingLocation()
        locationManager.startMonitoringSignificantLocationChanges()

    } else {

        locationManager.requestAlwaysAuthorization()

    }

}

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Моя ошибка заключалась в том, что я создавал строку с местоположением пользователя на карте вместо местоположения пользователя, переданного методу didUpdateLocations. Свойство userLocation на карте не обновляется в фоновом режиме, а свойство userLocation в CLLocationManager обновляется в фоновом режиме.

Вот исправленный код с комментарием к строке, которую я исправил:

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

    print("didUpdateLocations", locations)

    if let userLocation = locations.first, polyline != nil {

        let userLocationMapPoint = MKMapPoint(userLocation.coordinate)
        let lastUserLocationMapPoint = MKMapPoint(route.last!)

        totalDistance += userLocationMapPoint.distance(to: lastUserLocationMapPoint)

        mapView.removeOverlay(polyline)

        route.append(userLocation.coordinate) // changed from route.append(mapView.userLocation.coordinate)

        polyline = MKPolyline(coordinates: route, count: route.count)

        mapView.addOverlay(polyline)

    }

    print("latitude:", mapView.userLocation.coordinate.latitude, "longitude:", mapView.userLocation.coordinate.longitude)

}
1 голос
/ 11 марта 2020

Вы добавили в свой .plist Privacy - Location Always and When In Use Usage Description и Privacy - Location When In Use Usage Description?

Тогда, поскольку вы, вероятно, соответствует CLLocationManagerDelegate в методе didUpdateLocations, вы сможете выполнить свой код.

...