Невозможно отключить службу определения местоположения в приложении IOS после изменения вида - PullRequest
0 голосов
/ 23 апреля 2020

Я пытаюсь заставить Менеджер местоположений прекратить отслеживать местоположение пользователя, когда пользователь меняет представление, поскольку мне нужно только отображать местоположение пользователя в представлении карт Google только на первой вкладке.

Я пытаюсь включить диспетчер местоположений следующим образом:

 override func viewWillAppear(_ animated: Bool) {
      super.viewWillAppear(animated)
      navigationController?.setNavigationBarHidden(true, animated: animated)

      // get location manager if dissapepared
      if self.locationManager == nil {
        checkLocationServices()
      }
  }

// check if location services is working
func checkLocationServices(){
    if CLLocationManager.locationServicesEnabled(){
        // set up
        setupLocationService()
        checkLocationAuthoization()
    }else{
        showAlert("Location services not available", "Please enable location services!")
    }
}

private func setupLocationService(){
    self.locationManager = CLLocationManager() // LocationServices.getLocationManager()

    // set delegate to viewcontroller here
    self.locationManager.delegate = self
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest

    // efficient location usage 
    self.locationManager.pausesLocationUpdatesAutomatically = true

    self.locationManager.activityType = .otherNavigation

    // enable background update - crashed application
    // locationManager.allowsBackgroundLocationUpdates = true
}

private func checkLocationAuthoization() {
    // Request location authorization
    self.locationManager.requestAlwaysAuthorization()

    switch CLLocationManager.authorizationStatus() {
        case .authorizedWhenInUse:
            self.locationManager.startUpdatingLocation()
            // Do mapp stuff
            break
        case .denied:
            // show alert instructing on how to turn on permissions
            showAlert("Activate location", "Please allow Flype applciation to use your location.")
            break
        case .notDetermined:
            self.locationManager.requestAlwaysAuthorization()
            break
        case .restricted:
            break
        case .authorizedAlways:
            self.locationManager.startUpdatingLocation()
            break
        default:
            break
    }
}

// called every time location changed
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    let location = locations.last
    customMap.camera = GMSCameraPosition.camera(withLatitude: (location?.coordinate.latitude)!, longitude: (location?.coordinate.longitude)! , zoom: 15.0)
    customMap.animate(to: customMap.camera)
    self.locationManager.stopUpdatingLocation()
}

И я пытаюсь отключить его следующим образом:

override func viewWillDisappear(_ animated: Bool) {
    if self.locationManager != nil {
        self.locationManager.stopUpdatingHeading()
        self.locationManager = nil
        print("SET LOCATION TO NIL!")
    }
}

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Чтобы остановить обновление местоположения, вы должны позвонить stopUpdatingLocation, а не stopUpdatingHeading. Так что поменяйте

if self.locationManager != nil {
        self.locationManager.stopUpdatingHeading()
        self.locationManager = nil
        print("SET LOCATION TO NIL!")
}

С

self.locationManager.stopUpdatingLocation()
0 голосов
/ 23 апреля 2020

Вызов locationManager.stopUpdatingLocation() достаточно, чтобы остановить обновления местоположения. Это хороший способ сэкономить электроэнергию.

...