我正在开发一个应用程序,该应用程序应该能够在应用程序处于后台时收集位置数据。
为了实现这一点,我做了以下工作:
我在应用NSLocationAlwaysUsageDescription
中设置了Info.plist
密钥,并分配了适当的字符串值。
CLLocationManager
的实例,如下所示:
locationManager.activityType = .Fitness
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.pausesLocationUpdatesAutomatically = false
locationManager.requestAlwaysAuthorization()
,我有适当的委托回调来处理任何错误。locationManager.startUpdatingLocation()
在模拟器上运行应用程序时,我会打印出位置更新,并且应用程序的徽章也会根据收集的位置数进行更新,但是在实际设备上运行应用程序时,在后台发送应用程序,很快就会停止应用程序处理位置更新(我知道徽章停止更新)。
我是否缺少某种特定于设备的配置?
答案 0 :(得分:0)
这是我的设置,当应用程序在后台或设备处于待机模式时可以正常工作:
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.distanceFilter = kCLDistanceFilterNone
locationManager.pausesLocationUpdatesAutomatically = false
locationManager.activityType = .Other
locationManager.startUpdatingLocation()
我也在使用延期位置更新。在didUpdateLocations
:
if CLLocationManager.deferredLocationUpdatesAvailable() && deferringUpdates == false {
locationManager.allowDeferredLocationUpdatesUntilTraveled(CLLocationDistanceMax, timeout: deferredLocationTimeout)
deferringUpdates = true
}
和didFinishDeferredUpdatesWithError
:
deferringUpdates = false
答案 1 :(得分:0)
在iOS 9中设置功能是不够的。您还需要在位置管理器上设置locationManager.allowsBackgroundLocationUpdates = true
,然后操作系统才能在后台为您提供更新。根据文档强制这样做。默认情况下,它设置为false。请参阅here。