2015-09-05 38 views
0

我正在使用location背景模式跟蹤user visits,然後將一些數據發送到我的服務器的iOS應用程序。但是,我遇到了一些奇怪的網絡通信問題。 唯一的症狀是並非所有收集的數據都發送到服務器。在iOS背景模式下調試網絡通信

下面是對這個問題的詳細信息:

  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) 
         } 
    

因此,我得出結論:我做錯了,但我看不出什麼。我檢查了the article on background app execution,我的應用似乎符合它。還有什麼我可以錯過?

回答

0

您的應用程序是否已註冊以支持後臺模式?

由於您收到位置更新,您的應用程序應該有資格被設置爲在後臺模式下運行。在你的plist文件中設置「所需的背景模式」。

這將讓它完全在後臺運行,你可以擺脫beginBackgroundTask行。

beginBackgroundTaskWithExpirationHandler方法通常用於爲當前要完成的任務請求額外的一點時間,前提是您的應用程序位於前景中,並在任務中間移至背景。對我來說,這聽起來像你想在全背景模式下運行。

這樣說,你仍然應該檢測到你的程序是後端,避免運行不需要的CPU密集型任務來節省電池壽命。

+0

我的應用程序已經註冊了'location'背景模式。這應該就夠了,對吧?順便說一句,我認爲beginBackgroundTask是任何後臺任務的要求,無論應用程序是否使用完整的後臺模式,我會糾正。 –

+0

試着用這些後臺任務運行你的應用程序,讓我們知道它是如何工作的。 – jaybers

+0

會做;有沒有一種有效的方法來調試呢?等待下一個'didVisit'事件似乎並不方便 –