Swift:后台会话不支持完成处理程序块.请改为使用委托.

Jam*_*esG 1 ios swift

我是Swift的新手,因此不是很有经验.我不知道为什么这不起作用.

我正在尝试下载音乐文件,然后将其发送到AVAudoPlayer进行播放.

这是代码:

@IBAction func startDownload(_ sender: Any) {
    weak var weakSelf = self
    let url = URL(string: "http://www.noiseaddicts.com/samples_1w72b820/280.mp3")!
    let task = DownloadManager.shared.activate().downloadTask(with: url as URL, completionHandler: { (URL, response, error) -> Void in

        print("URL = \(URL)")

        weakSelf!.plays(url: URL! as URL)

    })
    task.resume()
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

DownloadTaskExample [31140:1527666]***由于未捕获的异常'NSGenericException'而终止应用程序,原因:'后台会话不支持完成处理程序块.请改为使用委托.

***第一次抛出调用堆栈:(0 CoreFoundation 0x0000000110bbf34b exceptionPreprocess + 171 1 libobjc.A.dylib 0x000000010db2f21e objc_exception_throw + 48 2 CFNetwork 0x00000001111ada2c - [__ NSURLBackgroundSession validateSerializabilityForRequest:completion:] + 172 3 CFNetwork 0x00000001111b035c - [__ NSURLBackgroundSession _onqueue_downloadTaskForRequest:resumeData:completion: ] + 36 4 CFNetwork的0x00000001111af37c __90 - [__ NSURLBackgroundSession downloadTaskForRequest:downloadFilePath:resumeData:完成:] _ block_invoke + 38 5 CFNetwork的0x00000001111adddb __68 - [__ NSURLBackgroundSession performBlockOnQueueAndRethrowExceptions:] _ block_invoke + 67 6 libdispatch.dylib 0x0000000111aa00cd _dispatch_client_callout + 8 7 libdispatch.dylib 0x0000000111a7d30a _dispatch_barrier_sync_f_invoke + 340 8 CFNetwork 0x00000001111add44 - [__ NSURLBackgroundSession performBlockOnQueueAndRethrowExceptions:] + 174 9 CFNetwork 0x00000001111af2e5 - [__ NSURLBackgroundSession downloadTaskForRequest:downloadFilePath:resumeData:完成:] + 243 10 DownloadTaskExample 0x000000010d54086d _TFC19DownloadTaskExample14ViewController13startDownloadfP_T_ + 525 11 DownloadTaskExample 0x000000010d540e33 _TToFC19DownloadTaskExample14ViewController13startDownloadfP_T_ + 67 12的UIKit 0x000000010e3685b8 - [UIApplication的sendAction:为:从:forEvent:] + 83 13的UIKit 0x000000010e4ededd - [UIControl sendAction:至:forEvent:] + 67 14 UIKit 0x000000010e4ee1f6 - [UIControl _sendActionsForEvents:withEvent:] + 444 15 UIKit 0x000000010e4ed0f2 - [UIControl touchesEnded:withEvent:] + 668 16 UIKit 0x000000010e3d5ce1 - [UIWindow _sendTouchesForEvent:] + 2747 17 UIKit 0x000000010e3d73cf - [UIWindow sendEvent:] + 4011 18 UIKit 0x000000010e38463f - [UIApplication sendEvent:] + 371 19 UIKit 0x000000010eb7671d __dispatchPreprocessedEventFromEventQueue + 3248 20 UIKit 0x000000010eb6f3c7 __handleEventQueue + 4879 21 CoreFoundation 0x0000000110b64311 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION + 17 22 CoreFoundation 0x0000000110 b4959c __CFRunLoopDoSources0 + 556 23的CoreFoundation 0x0000000110b48a86 __CFRunLoopRun + 918 24的CoreFoundation 0x0000000110b48494 CFRunLoopRunSpecific + 420 25 GraphicsServices 0x000000011444da6f GSEventRunModal + 161 26的UIKit 0x000000010e366964 UIApplicationMain + 159 27 DownloadTaskExample 0x000000010d54597f主+ 111 28 libdyld.dylib 0x0000000111aec68d启动+ 1 29 ??? 0x0000000000000001 0x0 + 1)

libc ++ abi.dylib:以NSException类型的未捕获异常终止

请有人帮助我,以便下载文件后,它会传递给播放功能,所以我可以播放它:)

Ps这是我正在使用的DownloadManager:https://www.ralfebert.de/snippets/ios/urlsession-background-downloads/

Tom*_*ton 7

这告诉你的是那个

  1. 创建自己时URLSession,使用了后台配置对象,即使用background(withIdentifier:)方法URLSessionConfiguration.
  2. 您开始下载,带有完成块.
  3. 这是不允许的.

这是不允许的原因是,通过后台下载,您的应用程序可能在下载完成后无法运行,但iOS想要唤醒您的应用程序,告诉它下载已完成.一旦您的应用停止运行,该完成块将不存在,因此它不是获取该通知的有效方式.

你有几个选择:

  • 您可以停止使用后台会话.有点像URLSessionConfiguration.default.但是没有后台下载.
  • 您可以删除回调,而是使用声明的方法URLSessionDelegate来获取下载结果.