我创建了一个应用程序(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()激活位置?
答案 0 :(得分:0)
如果您的位置代码已在工作,则问题出在其他地方。
一种导致您出现问题的常见情况是,使用viewDidLoad
或viewDidAppear
之类的视图控制器生命周期方法来设置位置管理器。如果应用在后台启动(从冷启动而不是从暂停状态启动),则其视图控制器将永远不会显示,并且视图生命周期方法(如viewDidAppear
也将不会被调用。
要调试后台位置问题,请将您的应用设置为在某些点(应用委托方法,视图控制器生命周期方法,位置管理器委托方法)发送本地通知,您可以实时查看发生的情况。