startMonitoringSignificantLocationChange does not invoke didUpdateLocations

184 Views Asked by At

I trying to record a path user is taking using GoogleMap SDK. I'm using polyline to draw line on a map to show user the path that is taken. In an attempt to cut down coordinates that is generated and to make line looks clean(instead of looking squiggly), I'm calling startMonitoringSignificantChange of CLLocationManger instead of startUpdatingLocation. However, that does not seem to work. It calls didUpdateLocations method just once when the view is loaded, but after that, it just stops calling. Where am I doing wrong?

This is my code

    override func viewDidLoad() {
        super.viewDidLoad()
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters
        locationManager.requestAlwaysAuthorization()

        locationManager.startMonitoringSignificantLocationChanges()

    }

    extension LocationViewController: CLLocationManagerDelegate {

        func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
            if status == .AuthorizedAlways {
                locationManager.startMonitoringSignificantLocationChanges()
                mapView.myLocationEnabled = true
                mapView.settings.myLocationButton = true
            }
        }

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

            if let location = manager.location {

                    path.addCoordinate(CLLocationCoordinate2D(latitude: location.coordinate.latitude,
                        longitude: location.coordinate.longitude))
                    let polyline = GMSPolyline(path: path)
                    polyline.strokeColor = UIColor.redColor()
                    polyline.strokeWidth = 3
                    polyline.geodesic = true
                    polyline.map = mapView

                    // Save the coordinates to array
                    coordinateArray.append([location.coordinate.latitude, location.coordinate.longitude])



                }


            }

        }
    }
1

There are 1 best solutions below

0
On

Add following lines of codes after locationManager.requestAlwaysAuthorization()

locationManager.allowsBackgroundLocationUpdates = true
locationManager.pausesLocationUpdatesAutomatically = false

p.s. If your view is holding locationManager instance, it may not receive location-updates after your view is un-loaded. You may remove following line as it is useless for significant-location-updates:

locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters