【问题标题】:Unable to disable location service in IOS application after changing View更改视图后无法在 IOS 应用程序中禁用定位服务
【发布时间】:2020-04-22 22:09:48
【问题描述】:

我试图让位置管理器在用户更改视图时停止跟踪用户的位置,因为我只需要在第一个选项卡中的谷歌地图视图上显示用户位置。

我正在尝试通过以下方式启用位置管理器:

 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!")
    }
}

【问题讨论】:

    标签: ios swift cllocationmanager location-services


    【解决方案1】:

    为了停止位置更新,您应该调用stopUpdatingLocation 而不是stopUpdatingHeading。所以改变

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

    self.locationManager.stopUpdatingLocation()
    

    【讨论】:

    • 我已经在 didUpdateLocations 的末尾完成了该操作,但我还是在您建议的地方添加了该操作。但是,位置箭头仍然会一直出现在其他视图中,如果我理解正确,只要应用程序不再使用位置服务,它就会消失。
    • 你说的位置箭头是什么意思?
    • 我的意思是状态栏中的位置箭头,当应用程序停止跟踪用户位置时,它应该会消失。
    【解决方案2】:

    调用locationManager.stopUpdatingLocation() 足以停止位置更新。这是一种省电的好方法。

    【讨论】:

    • 我已经在 didUpdateLocations 的末尾完成了该操作,但我还是在您建议的地方添加了该操作。但是,位置箭头仍然会一直出现在其他视图中。
    • @DaniKurkees 你的意思是状态栏上的位置箭头吗?我更喜欢 requestwhenInuseauthorization() 而不是 requestAlwaysAuthorization(),我不确定箭头是否会消失。
    • 是的,我指的是状态栏中的位置箭头。当应用停止跟踪用户时,它是否应该消失?
    • @DaniKurkees 是的,它必须在停止跟踪时消失。我刚刚检查了requestwhenInuseauthorization() 工作正常。它满足您的要求。
    • 我也试过了,但它不起作用。由于我停止在 didUpdateLocations 函数中更新位置,当前代码将仅跟踪用户位置一次。但是,当我更改视图时,由于某种原因,位置箭头仍然出现在状态栏中。
    猜你喜欢
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多