LocationManager:有时无法启动startUpdatingLocation

时间:2019-04-12 08:35:51

标签: ios swift

我创建了一个应用程序(Swift 4.0),当它接近iBeacon时,它会通过startUpdatingLocation()开始本地化。 无论是在前台的应用程序,在后台的应用程序还是在已终止的应用程序中,一切都可以完美运行。 但有时位置不会开始。 看起来它从未被称为locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])

我登录了所有内容:调用了startUpdatingLocation方法,并且一切都配置正确。

我还尝试将startMonitoringSignificantLocationChanges()startUpdatingLocation()结合使用:这样,本地化开始于大概由startMonitoringSignificantLocationChanges调用的回调之后(实际上,首次检测已触发超过500米后)。但是,即使这个技巧也并不总是有效。

我也尝试过allowDeferredLocationUpdates(untilTraveled distance: CLLocationDistance, timeout: TimeInterval)来开始本地化,但是什么也没有。

我还尝试异步开始本地化:它没有解决。

我尝试使用pausesLocationUpdatesAutomatically正确和错误:什么都没有。

从不调用locationManager(_ manager: CLLocationManager, didFailWithError error: Error)方法。

下面是locationManager配置代码和本地化激活方法:

func configureLocationService() {
  locationManager = CLLocationManager()

  locationManager?.delegate = AppDelegate.shared
  locationManager?.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
  locationManager?.distanceFilter = Double(Configuration.getMinimumDistanceInMeters())

  locationManager?.activityType = .fitness

  locationManager?.pausesLocationUpdatesAutomatically = true

//  locationManager?.pausesLocationUpdatesAutomatically = false
  locationManager?.allowsBackgroundLocationUpdates = true
  if #available(iOS 11.0, *) {
    locationManager?.showsBackgroundLocationIndicator = true
  } else {
    // Fallback on earlier versions
  }
  locationManager?.requestAlwaysAuthorization()
}

...

func locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion) {
  if CLLocationManager.locationServicesEnabled() && CLLocationManager.authorizationStatus() == .authorizedAlways {
    manager.startMonitoringSignificantLocationChanges()

    DispatchQueue.main.asyncAfter(deadline: .now() + 2, execute: {
      manager.stopMonitoringSignificantLocationChanges()

      DispatchQueue.main.asyncAfter(deadline: .now() + 1, execute: {
        manager.startMonitoringSignificantLocationChanges()
        manager.startUpdatingLocation()

        UIApplication.shared.applicationIconBadgeNumber += 1
        let generator = UINotificationFeedbackGenerator()
        generator.notificationOccurred(.success)
      }
    }
  }
}

我做错什么了吗?有没有一种方法可以始终通过startUpdatingLocation()激活位置?

1 个答案:

答案 0 :(得分:0)

如果您的位置代码已在工作,则问题出在其他地方。

一种导致您出现问题的常见情况是,使用viewDidLoadviewDidAppear之类的视图控制器生命周期方法来设置位置管理器。如果应用在后台启动(从冷启动而不是从暂停状态启动),则其视图控制器将永远不会显示,并且视图生命周期方法(如viewDidAppear也将不会被调用。

要调试后台位置问题,请将您的应用设置为在某些点(应用委托方法,视图控制器生命周期方法,位置管理器委托方法)发送本地通知,您可以实时查看发生的情况。