设置后台配置

创建后台会话

 // 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 调用的一部分创建的临时会话,则现在无效的应用内会话与后台守护程序中的会话之间的关联不再存在。