我想每15分钟将用户当前的Location
发送到服务器。当应用程序在前台时,timer
正在运行,但是当应用程序在后台时,计时器没有运行。我搜索了很多,但没有找到任何解决方案。你能告诉我我做什么。我正在使用以下代码进行后台位置同步,但无法正常工作。
var locationManager = CLLocationManager()
var currentLocation: CLLocation?
var timer : Timer?
var backgroundTaskIdentifier: UIBackgroundTaskIdentifier?
func getCurrentLocation()
{
// Do any additional setup after loading the view, typically from a nib.
locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.requestAlwaysAuthorization()
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.allowsBackgroundLocationUpdates = true
locationManager.pausesLocationUpdatesAutomatically = false
//
backgroundTaskIdentifier = UIApplication.shared.beginBackgroundTask(expirationHandler: {
UIApplication.shared.endBackgroundTask(self.backgroundTaskIdentifier!)
})
let timer = Timer.scheduledTimer(withTimeInterval: 10.0, repeats: true) { (timer) in
self.locationManager.startUpdatingLocation()
}
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
{
print("locations = \(locations)")
if let location = locations.last
{
print("location\(String(describing: location.coordinate))")
currentLocation = location
locationManager.stopUpdatingLocation()
}
}
答案 0 :(得分:0)
我也有类似的要求,但是时间间隔是5分钟。
您的应用可能闲置了更长的时间(15分钟),原因是操作系统未更新您的位置。
尝试保持较短的时间间隔,然后尝试使用。
答案 1 :(得分:0)
您是否从AppDelegate
处理应用程序状态的位置更新?如果没有,则可以使用AppDelegate
中的以下方法更新代码。
var locationManager = CLLocationManager()
func doBackgroundTask() {
DispatchQueue.global(qos: .background).async {
self.beginBackgroundUpdateTask()
self.StartupdateLocation()
RunLoop.current.run()
}
}
func beginBackgroundUpdateTask() {
backgroundUpdateTask = UIApplication.shared.beginBackgroundTask(expirationHandler: {
self.endBackgroundUpdateTask()
})
}
func endBackgroundUpdateTask() {
UIApplication.shared.endBackgroundTask(self.backgroundUpdateTask)
self.backgroundUpdateTask = UIBackgroundTaskInvalid
}
func StartupdateLocation() {
locationManager.startUpdatingLocation()
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.distanceFilter = kCLDistanceFilterNone
locationManager.requestAlwaysAuthorization()
locationManager.allowsBackgroundLocationUpdates = true
locationManager.pausesLocationUpdatesAutomatically = false
}
在应用程序进入后台状态时调用该方法。
func applicationWillResignActive(_ application: UIApplication) {
self.doBackgroundTask()
}
当应用程序在后台运行时,此方法将帮助您获取位置更新。 如果您遇到其他困难,可以查看此链接。 Update location in Background