Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 完成后在后台下载并唤醒应用程序_Swift_Background Process_Download_Urlsession - Fatal编程技术网

Swift 完成后在后台下载并唤醒应用程序

Swift 完成后在后台下载并唤醒应用程序,swift,background-process,download,urlsession,Swift,Background Process,Download,Urlsession,我使用配置为后台会话的URLSession来下载一些文件。下载完成后,我使用: func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) 移动下载的文件。一切正常,只是当应用程序在后台时,不会调用此函数。它在应用程序恢复到前台后立即调用,但我希望系统在文件下载后唤醒我的应用程序。有办法做到这一点吗?确实有:) 您可能需要更改

我使用配置为后台会话的URLSession来下载一些文件。下载完成后,我使用:

func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL)
移动下载的文件。一切正常,只是当应用程序在后台时,不会调用此函数。它在应用程序恢复到前台后立即调用,但我希望系统在文件下载后唤醒我的应用程序。有办法做到这一点吗?

确实有:)

您可能需要更改设置中的一些内容

首先,您使用的
URLSessionConfiguration
应为
background
类型,如下所示:

URLSessionConfiguration.background(withIdentifier: "your.unique.id.here")
然后,在
AppDelegate
中,您需要实现此方法:

func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void)
您可以在其中执行类似于存储
completionHandler
的操作,以便以后可以使用它

最后,你通常在哪里做你的“完成下载”魔术。。。通常在这里:

 func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL)
您需要检查是否存在
completionHandler
,如果存在,则调用它

例子 上面的最后两位可能看起来有点…嗯??下面是一个例子

AppDelegate
中,您可以为
completionHandler
定义一个可选项,以便以后存储:

var backgroundSessionCompletionHandler: (() -> Void)?
然后方法如下所示:

func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void) {
    if identifier == "your.unique.id.here" {
        backgroundSessionCompletionHandler = completionHandler
    }
}
if  let appDelegate = UIApplication.shared.delegate as? AppDelegate,
    let completionHandler = appDelegate.backgroundSessionCompletionHandler {
        appDelegate.backgroundSessionCompletionHandler = nil
        OperationQueue.main.addOperation {
            completionHandler()
        }
    }
然后,您“只”需要在处理完下载的文件后调用它,您可以这样做:

func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void) {
    if identifier == "your.unique.id.here" {
        backgroundSessionCompletionHandler = completionHandler
    }
}
if  let appDelegate = UIApplication.shared.delegate as? AppDelegate,
    let completionHandler = appDelegate.backgroundSessionCompletionHandler {
        appDelegate.backgroundSessionCompletionHandler = nil
        OperationQueue.main.addOperation {
            completionHandler()
        }
    }
另外,我们来看一个例子

希望这对你有帮助。

确实有:)

您可能需要更改设置中的一些内容

首先,您使用的
URLSessionConfiguration
应为
background
类型,如下所示:

URLSessionConfiguration.background(withIdentifier: "your.unique.id.here")
然后,在
AppDelegate
中,您需要实现此方法:

func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void)
您可以在其中执行类似于存储
completionHandler
的操作,以便以后可以使用它

最后,你通常在哪里做你的“完成下载”魔术。。。通常在这里:

 func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL)
您需要检查是否存在
completionHandler
,如果存在,则调用它

例子 上面的最后两位可能看起来有点…嗯??下面是一个例子

AppDelegate
中,您可以为
completionHandler
定义一个可选项,以便以后存储:

var backgroundSessionCompletionHandler: (() -> Void)?
然后方法如下所示:

func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void) {
    if identifier == "your.unique.id.here" {
        backgroundSessionCompletionHandler = completionHandler
    }
}
if  let appDelegate = UIApplication.shared.delegate as? AppDelegate,
    let completionHandler = appDelegate.backgroundSessionCompletionHandler {
        appDelegate.backgroundSessionCompletionHandler = nil
        OperationQueue.main.addOperation {
            completionHandler()
        }
    }
然后,您“只”需要在处理完下载的文件后调用它,您可以这样做:

func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void) {
    if identifier == "your.unique.id.here" {
        backgroundSessionCompletionHandler = completionHandler
    }
}
if  let appDelegate = UIApplication.shared.delegate as? AppDelegate,
    let completionHandler = appDelegate.backgroundSessionCompletionHandler {
        appDelegate.backgroundSessionCompletionHandler = nil
        OperationQueue.main.addOperation {
            completionHandler()
        }
    }
另外,我们来看一个例子


希望这对您有所帮助。

谢谢您的回答。事实证明,当我在一台设备上测试它是否按预期工作时,一切都已经正常工作了,但在模拟器中并没有。此外,我并没有真正使用handleEventsForBackgroundURLSession函数,因为每次应用程序启动后,我只是创建一个对象,该对象创建具有相同标识符的会话,并实现其委托。似乎对每种情况都有效,但我不能100%确定这种方法是否有效。将测试并查看。啊,是的……你是对的,它在模拟器中没有按预期工作,我忘记了,对不起。很高兴你能成功,祝你好运:)谢谢你的回答。事实证明,当我在一台设备上测试它是否按预期工作时,一切都已经正常工作了,但在模拟器中并没有。此外,我并没有真正使用handleEventsForBackgroundURLSession函数,因为每次应用程序启动后,我只是创建一个对象,该对象创建具有相同标识符的会话,并实现其委托。似乎对每种情况都有效,但我不能100%确定这种方法是否有效。将测试并查看。啊,是的……你是对的,它在模拟器中没有按预期工作,我忘记了,对不起。很高兴你能成功,祝你好运:)