我是 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()
}
我收到的错误是:
DownloadTaskExample[31140:1527666] *** 由于未捕获的异常“NSGenericException”而终止应用程序,原因:“后台会话中不支持完成处理程序块。请改为使用代表。
*** 首先抛出调用堆栈:
(
0 核心基础 0x0000000110bbf34b异常预处理 + 171
1 libobjc.A.dylib 0x000000010db2f21e objc_异常_抛出 + 48
2 CFNetwork 0x00000001111ada2c -[__NSURLBackgroundSession validateSerializabilityForRequest:完成:] + 172
3 CFNetwork 0x00000001111b035c -[__NSURLBackgroundSession _onqueue_downloadTaskForRequest:resumeData:完成:] + 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 TouchsEnded:withEvent:] + 668
16 UIKit 0x000000010e3d5ce1 - [UIWindow _sendTouchesForEvent:] + 2747
17 UIKit 0x000000010e3d73cf - [UIWindow发送事件:] + 4011
18 UIKit 0x000000010e38463f - [UIApplication发送事件:] + 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 main + 111
28 libdyld.dylib 0x0000000111aec68d 开始 + 1
29 ??? 0x0000000000000001 0x0 + 1
)
libc++abi.dylib:以 NSException 类型的未捕获异常终止
请有人帮助我,以便文件下载后将其传递到plays功能,这样我就可以玩它:)
P.s 这是我正在使用的下载管理器:https://www.ralfebert.de/snippets/ios/urlsession-background-downloads/ https://www.ralfebert.de/snippets/ios/urlsession-background-downloads/
这告诉你的是
- 当你创建你的
URLSession
,您使用了后台配置对象,即background(withIdentifier:)
方法上URLSessionConfiguration
.
- 您开始下载,并带有完成块。
- 这是不允许的。
不允许这样做的原因是,对于后台下载,下载完成时您的应用程序可能不会运行,但 iOS 想要唤醒您的应用程序以告诉它下载已完成。一旦您的应用程序停止运行,该完成块将不存在,因此这不是获取该通知的有效方法。
您有几个选择:
- 您可以停止使用后台会话。就像是
URLSessionConfiguration.default
。但没有后台下载。
- 您可以删除回调并使用中声明的方法
URLSessionDelegate
获取下载结果。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)