2016-11-15 56 views
0

殺死這是情景:NSURLSession背景的配置和應用程序被用戶

  • NSURLSession與後臺配置
  • 下載或上傳任務啓動不良或無Internet連接。
  • 用戶關閉應用程序。
  • 如果iOS獲得Internet連接將星會話任務。但是,
  • 隨着任務仍在等待互聯網。
  • 用戶關閉應用程序
  • 系統將取消所有未決任務

問題

有可能當用戶再次打開該應用程序,任務被取消知道嗎?

如果是,在哪裏?


This Answer說是的,這是可能的,但我不能讓任何回調返回我一個錯誤。

我正在使用Alamofire來處理我所有的網絡通話。但是,我懷疑Alamofire會改變這種行爲。


編輯1個

/// Networking manager with Background Session Configuration 
static var backgroundManager: Alamofire.Manager = { 

    let configuration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier("com.xxx.NetworkingManager.Identifier") 
    configuration.HTTPAdditionalHeaders = Manager.defaultHTTPHeaders 

    let backgroundManager = Alamofire.Manager(configuration: configuration) 
return backgroundManager 
}() 
+1

當應用程序重新啓動時,您是否肯定使用適當的標識符重新啓動背景「NSURLSession」?顯然你不能依賴['handleEventsForBackgroundURLSession'](https://developer.apple.com/reference/uikit/uiapplicationdelegate/1622941-application)來啓動它,所以你必須自己啓動它。 – Rob

+0

我想是的。我用我的代碼更新了答案,以啓動後臺NSURLSession。我需要那樣的東西嗎? –

+1

我會添加一個日誌語句或斷點來確認。但是'static'被懶惰地實例化,如果你從不引用它,將不會被調用。 – Rob

回答

0

榮譽給Rob,因爲他給我正確的道路。

因此,在用戶殺死應用程序後,系統取消所有待處理任務。


你可以看到,與SYSTEM.LOG:

仿真/調試/打開系統日誌...

如何趕上了已經持續?

再次實例化您的背景NSURLSession。在別的地方做,但我會在這個例子的AppDelegate中做。

系統知道(感謝標識符)它是同一個後臺會話,因此它會映射未決任務。

然後檢索所有任務。取消的任務仍然存在

任務將出現錯誤,您可以檢查。

Error Domain=NSURLErrorDomain Code=-999 "(null)" 
UserInfo={NSErrorFailingURLStringKey=http://your.api.com/url,  
NSURLErrorBackgroundTaskCancelledReasonKey=0,   
NSErrorFailingURLKey=http://your.api.com/url} 

此外,通過任務,您將獲得請求URL,因此您可以映射應用請求並執行某些操作。

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 


    // This is the code for Swift 2.x. In Swift 3.x this call is a bit different. 
    NetworkingManager.backgroundManager.session.getTasksWithCompletionHandler { (data, upload, download) in 

     for task in data { 

      NSLog("\(task.error)") 
     } 

     for task in upload { 

      NSLog("\(task.error)") 
     } 

     for task in download { 

      NSLog("\(task.error)") 

      let reason = task.error?.userInfo[NSURLErrorBackgroundTaskCancelledReasonKey] as? Int 
      let code = task.error?.code 

      if reason == NSURLErrorCancelledReasonUserForceQuitApplication && 
       code == NSURLErrorCancelled { 

       NSLog("\(task.originalRequest)") 
       NSLog("\(task.currentRequest?.URL)") 
      } 
     } 
    } 
} 

NSURLErrorCancelledReasonUserForceQuitApplication - >操作被取消,因爲用戶不得不應用程序退出。

所以我們走在正確的軌道上。 如果有人有更好的解決方案,請分享!我真的不喜歡我的請求URL的映射解決方案。