在iOS后台模式下调试网络通信

时间:2015-09-05 14:32:26

标签: ios swift core-location cllocationmanager alamofire

我正在使用iOS应用程序,该应用程序利用location后台模式跟踪user visits,然后将一些数据发送到我的服务器。但是,我遇到了一些奇怪的网络通信问题。 唯一的症状是并非所有收集的数据都会发送到服务器。

以下是有关此问题的更多信息:

  1. 我的服务器会记录收到的所有内容。没有服务器端错误,并且每个客户端请求都已成功记录。
  2. 客户端应用在调用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)
             }
    
  3. 因此,我总结说我做错了什么,但我不知道是什么。我检查了the article on background app execution,我的应用似乎符合它。我还能错过什么?

1 个答案:

答案 0 :(得分:0)

您的应用是否已注册以支持后台模式?

由于您收到位置更新,因此您的应用应符合设置为在后台模式下运行的条件。设置"必需的背景模式"在你的plist文件中。

这将让它在后台完全运行,你可以摆脱beginBackgroundTask行。

beginBackgroundTaskWithExpirationHandler方法通常用于请求一些额外的时间来完成当前任务,前提是您的应用程序位于前台并且在任务中间移动到后台。对我来说,听起来你想要以完整的后台模式运行。

话虽如此,您仍然应该检测到您的程序是后台运行的,并避免运行不需要的CPU密集型任务以节省电池寿命。