我正在开发一个应用程序,我需要每天更新应用程序中的数据。我决定使用背景提取。我正在从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/

10-09 16:30
查看更多