我正在开发一个应用程序,我需要每天更新应用程序中的数据。我决定使用背景提取。我正在从API下载数据,所以我正在使用URLSession。由于performFetchWithCompletionHandler
中不允许使用任何完成处理程序,因此我为此使用了委托。但是我的问题是,当我的应用未运行时尝试更新数据时,未调用didRecieve data
函数。我是在做错什么,还是应该每天使用其他东西通过API更新数据?
我的代码如下:
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
内部被调用并创建新的dataTask
,但未调用didRecieve 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()
感谢您的任何建议!
最佳答案
我记得在后台仅支持上传下载,不支持数据任务。
没错,您不能使用带有完成处理程序的调用。您必须提供一名代表。
在Xcode中搜索字符串“在后台下载内容”。有大量的文档。
要点是,系统将在需要时重新启动您的应用程序并调用其application:handleEventsForBackgroundURLSession:completionHandler:
方法。
您必须在info.plist文件中设置适当的应用程序权限。 (我不记得您是否必须征求用户的许可才能进行后台下载。请参阅文档。)
以下是Apple Xcode文档中信息的第一部分:
在后台下载内容
下载文件时,应用程序应使用NSURLSession对象来
开始下载,以便系统可以控制
应用被暂停或终止时的下载过程。当你
配置NSURLSession对象以进行后台传输,系统
在单独的流程中管理这些转移并向后报告状态
以通常的方式访问您的应用。如果您的应用程式在终止时
传输正在进行中,系统继续在
转移时启动后台并启动您的应用(视情况而定)
完成或需要您的应用关注的一项或多项任务。
要支持后台传输,必须配置NSURLSession
适当地反对。要配置 session ,必须首先创建
NSURLSessionConfiguration对象,并将几个属性设置为
适当的值。然后,您将该配置对象传递给
创建您的NSURLSession的适当初始化方法
session 。
创建支持的配置对象的过程
后台下载如下:
使用以下命令创建配置对象
backgroundSessionConfigurationWithIdentifier:方法
NSURLSessionConfiguration。设置配置对象的值
sessionSendsLaunchEvents属性设置为YES。如果您的应用开始转移
当它在前景中时,建议您还设置
配置对象的任意属性设为YES。配置
配置对象的其他任何适当属性。用
配置对象以创建您的NSURLSession对象。一旦
配置后,您的NSURLSession对象可以无缝地进行上传和
在适当的时间将任务下载到系统。如果任务完成
当您的应用仍在运行时(在前台或
后台), session 对象通常会通知其委托
办法。如果任务尚未完成,系统将终止您的
应用程序,系统会自动继续管理
背景。如果用户终止您的应用程序,系统将取消所有
待处理的任务。
当与后台 session 相关的所有任务都完成时
完成后,系统会重新启动已终止的应用程序(假设
sessionSendsLaunchEvents属性设置为YES,并且用户
而不是强制退出应用程序)并致电应用程序代表的
应用程序:handleEventsForBackgroundURLSession:completionHandler:
方法。 (系统可能还会重新启动该应用以处理身份验证
挑战或其他与任务相关的事件,需要您的应用
注意。)在实现该委托方法时,请使用
提供的标识符来创建新的NSURLSessionConfiguration和
NSURLSession对象具有与以前相同的配置。系统
将新的 session 对象重新连接到先前的任务和报告
它们对 session 对象的代表的状态。
关于ios - 在后台提取中使用URLSession更新数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45640231/