我正在使用iOS应用程序,该应用程序利用location
后台模式跟踪user visits,然后将一些数据发送到我的服务器。但是,我遇到了一些奇怪的网络通信问题。 唯一的症状是并非所有收集的数据都会发送到服务器。
以下是有关此问题的更多信息:
客户端应用在调用locationManager:didVisit:
方法时会创建本地通知。当您到达某个地点并离开时,此通知会按预期显示。然后,它通过HTTPS调用服务器并发布另一个通知,每次都不会出现。整个设置如下:
// This code is executed from locationManager:didVisit: when the app is in background.
let myVisit: CLVisit! = ... // the received visit
self.postLocalNotification("Visit received!", visit: myVisit)
let task = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler(nil)
Alamofire.request(.POST, apiMethod("visit"), parameters: params, encoding: .JSON)
.responseJSON { (request, response, JSON, error) in
// This gets executed only some time, wtf?
self.postLocalNotification("Visit reported!", visit: myVisit)
UIApplication.sharedApplication().endBackgroundTask(task)
}
因此,我总结说我做错了什么,但我不知道是什么。我检查了the article on background app execution,我的应用似乎符合它。我还能错过什么?
答案 0 :(得分:0)
您的应用是否已注册以支持后台模式?
由于您收到位置更新,因此您的应用应符合设置为在后台模式下运行的条件。设置"必需的背景模式"在你的plist文件中。
这将让它在后台完全运行,你可以摆脱beginBackgroundTask行。
beginBackgroundTaskWithExpirationHandler方法通常用于请求一些额外的时间来完成当前任务,前提是您的应用程序位于前台并且在任务中间移动到后台。对我来说,听起来你想要以完整的后台模式运行。
话虽如此,您仍然应该检测到您的程序是后台运行的,并避免运行不需要的CPU密集型任务以节省电池寿命。