斯威夫特:'Completion handler blocks are not supported in background sessions. Use a delegate instead.'



我是 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()
}

我得到的错误是:

下载任务示例[31140:1527666] *** 由于未捕获的异常"NSGenericException"而终止应用,原因:"后台会话不支持完成处理程序块。请改用委托。

第一个抛出调用堆栈: ( 0 核心基金会 0x0000000110bbf34b例外预处理 + 171 1 利比亚博博杰克。A.迪利布 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:completion:]_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:completion:] + 243 10 下载任务示例 0x000000010d54086d _TFC19DownloadTaskExample14ViewController13startDownloadfP_T_ + 525 11 下载任务示例 0x000000010d540e33 _TToFC19DownloadTaskExample14ViewController13startDownloadfP_T_ + 67 12 UIKit 0x000000010e3685b8 -[UIApplication sendAction:to:from:forEvent:] + 83 13 UIKit 0x000000010e4ededd -[UIControl sendAction:to: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 核心基金会 0x0000000110b64311 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION+ 17 22 核心基金会 0x0000000110b4959c __CFRunLoopDoSources0 + 556 23 核心基金会 0x0000000110b48a86 __CFRunLoopRun + 918 24 核心基金会 0x0000000110b48494 CFRunLoopRunSpecific + 420 25 图形服务 0x000000011444da6f GSEventRunModal + 161 26 UIKit 0x000000010e366964 UIApplicationMain + 159 27 下载任务示例0x000000010d54597f主 + 111 28 libdyld.dylib 0x0000000111aec68d start + 1 29 ??? 0x0000000000000001 0x0 + 1 )

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

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

P.s这是我正在使用的下载管理器:https://www.ralfebert.de/snippets/ios/urlsession-background-downloads/

这告诉你的是

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

不允许这样做的原因是,对于后台下载,下载完成后你的应用可能无法运行,但 iOS 希望唤醒你的应用以告诉它下载已完成。一旦你的应用停止运行,该完成块将不存在,因此这不是获取该通知的有效方法。

您有以下几种选择:

  • 您可以停止使用后台会话。像URLSessionConfiguration.default.不过,没有后台下载。
  • 您可以删除回调,改用URLSessionDelegate中声明的方法获取下载结果。

最新更新