在后台抓取中使用URLSession更新数据

问题描述:

我正在开发一个应用程序,每天都需要更新我应用程序中的数据。我决定使用后台抓取。我从API下载数据,所以我使用URLSession。由于performFetchWithCompletionHandler中没有允许完成处理程序,因此我正在使用委托来实现此目的。但我的问题是,当我尝试更新数据时,我的应用程序没有运行功能didRecieve data未被调用。我做错了什么,或者我应该使用其他什么来每天从API更新数据?在后台抓取中使用URLSession更新数据

我的代码如下:

func createTask(url: String, id: String){ 
    let accessKey = UserDataService().getCurrentUser().accessToken 

    let backgroundConfigObject = URLSessionConfiguration.background(withIdentifier: id + UUID().uuidString) 
    let backgroundSession = URLSession(configuration: backgroundConfigObject, delegate: self, delegateQueue: nil) 


    var request = URLRequest(url: URL(string: url)!) 
    request.setValue("Bearer \(accessKey!)", forHTTPHeaderField: "Authorization") 
    request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
    request.httpMethod = "GET" 

    let task = backgroundSession.dataTask(with: request) 

    task.resume() 

    print("task resumed") 
} 

这个函数被调用内部performFetchWithCompletionHandler并创建新dataTaskdidRecieve data不叫。

我也尝试添加内部performFetchWithCompletionHandler

print("BG FETCH") 

let url = "secret url" 

var request = URLRequest(url: URL(string: url)!) 
request.setValue("SOME KEY", forHTTPHeaderField: "Authorization") 
request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
request.httpMethod = "GET" 

URLSession.shared.dataTask(with: request, completionHandler: { (data, response, error) in 
    print("DATA",data) 
    completionHandler(.newData) 
}).resume() 

谢谢你的任何建议,这个代码!

+0

我不确定,但非常怀疑它可以*从backgroundState *开始* backgroundSession。 如果它已经*在前台启动,则只能继续。想象一下,如果应用程序能够进行长时间的后台下载并且用户永远不知道,并且使用他的手机数据下载了实现的5Gb,会发生什么情况。他们会立即删除您的应用程序! – Honey

+0

@Honey然后你有什么建议。我的应用程序取决于更新。 – Phyber

+0

我还没有使用过后台App刷新,但看了一下,没有看到任何提及:“在performFetchWithCompletionHandler中不允许完成处理程序” Honey

据我记得,只有上传下载支持后台,而不是数据任务。

你说得对,你不能使用带有完成句柄的调用。你必须提供一个委托。

在Xcode中搜索字符串“在后台下载内容”。有相当广泛的文档。

它的要点是系统会根据需要重新启动您的应用程序并调用它的application:handleEventsForBackgroundURLSession:completionHandler:方法。

您必须在您的info.plist文件中设置正确的应用程序权限。 (我不记得,如果你要问允许做后台下载或没有用户请参阅该文档。)

下面是信息的从苹果的Xcode文件的第一部分:

在背景技术

下载内容当下载的文件,应用应使用NSURLSession目的是 开始下载,以使系统可以采取 下载过程的情况下,应用程序被暂停或终止的控制。当您为 配置NSURLSession对象以进行后台传输时,系统 会管理这些传输,并以通常方式将您的应用程序的状态报告回 。如果您的应用在 传输正在进行时终止,系统将继续传输 背景,并在传输 完成时或当一个或多个任务需要您的应用关注时启动您的应用(如适用)。

要支持后台传输,您必须适当地配置您的NSURLSession 对象。要配置会话,您必须先创建一个NSURLSessionConfiguration对象并设置 多个属性为 适当的值。然后在创建 会话时,将该配置对象传递给适当的NSURLSession初始化方法 。

用于创建支持 后台下载配置对象的过程如下:

创建使用 backgroundSessionConfigurationWithIdentifier配置对象: NSURLSessionConfiguration的方法。将配置对象的 sessionSendsLaunchEvents属性的值设置为YES。如果您的应用程序在前台处开始传输 ,则建议您还将配置对象的 任意属性设置为YES。根据需要配置 配置对象的任何其他属性。使用 配置对象来创建您的NSURLSession对象。一旦配置了 ,您的NSURLSession对象将在适当的时候无缝地将上传和 下载任务移交给系统。如果任务在应用程序仍在运行时完成 (无论是在前台还是在 后台),会话对象都会以通常的 方式通知其代表。如果任务尚未完成且系统终止您的应用程序,系统将自动继续管理背景中的任务 。如果用户终止您的应用程序,系统将取消任何 待处理任务。

当所有的与背景会话相关的任务 完成后,系统将重新启动已终止的应用程序(假设 sessionSendsLaunchEvents属性设置为YES,并且用户也 没有强制退出应用程序),并调用应用程序委托人 应用程序:handleEventsForBackgroundURLSession:completionHandler: 方法。 (该系统还可以重新启动应用程序来处理身份验证 挑战或需要您的应用 关注其他任务相关的事件。)在你的实现是委托方法,使用 提供的标识符,以创建一个新的NSURLSessionConfiguration和 NSURLSession物体与之前相同的配置。系统 将您的新会话对象重新连接到之前的任务,并将其状态报告给会话对象的委托。