設定後臺配置

建立後臺會話

 // Swift:
 let mySessionID = "com.example.bgSession"
 let bgSessionConfig = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier(mySessionID)
 
 let session = NSURLSession(configuration: bgSessionConfig)
 
 // add tasks here

 // Objective-C:
 NSString *mySessionID = @"com.example.bgSession";
 NSURLSessionConfiguration *configuration =
     [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier: mySessionID];
 NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration
                                                       delegate:self]

此外,在 iOS 中,你必須設定對處理後臺應用重新啟動的支援。當你的應用程式的 application:handleEventsForBackgroundURLSession:completionHandler:方法(Objective-C)或 application(_:handleEventsForBackgroundURLSession:completionHandler:) 方法(Swift)被呼叫時,這意味著你的應用程式已在後臺重新啟動以處理會話活動。

在該方法中,你應該使用提供的識別符號建立一個新會話,並使用委託對其進行配置,以像處理前臺一樣處理事件。此外,你應該使用會話作為鍵將提供的完成處理程式儲存在字典中。

當呼叫委託的 URLSessionDidFinishEventsForBackgroundURLSession:(Obj-C)/ URLSessionDidFinishEventsForBackgroundURLSession(Swift)方法告訴你沒有其他事件要處理時,你的應用應該查詢該會話的完成處理程式,從字典中刪除會話,並呼叫完成處理程式,從而告訴作業系統你不再具有與會話相關的任何未完成的處理。 (如果在獲得該委託呼叫時仍因某些原因仍在執行某些操作,請等待完成。)只要呼叫該方法,後臺會話就會立即失效。

如果你的應用程式隨後收到 application:application:didFinishLaunchingWithOptions:呼叫(可能表示使用者在你忙於處理後臺事件時對你的應用程式進行了預設),則可以安全地建立具有相同識別符號的後臺會話,因為具有該識別符號的舊會話不再存在。

如果你對細節很感興趣,那麼在建立後臺會話時,你會做兩件事:

  • 在外部守護程式(nsurlsessiond)中建立會話以處理下載
  • 在你的應用程式中建立一個通過 NSXPC 與該外部守護程式通訊的會話

通常,在應用程式的單次啟動中建立具有相同會話 ID 的兩個會話是危險的,因為它們都試圖與後臺守護程式中的同一會話進行通訊。這就是官方文件說永遠不會建立具有相同識別符號的多個會話的原因。但是,如果第一個會話是作為 handleEventsForBackgroundURLSession 呼叫的一部分建立的臨時會話,則現在無效的應用內會話與後臺守護程式中的會話之間的關聯不再存在。