swift - 如何在 Swift 4 中将 HTTP 基本身份验证传递给 AVAudioPlayer
问题描述
我正在尝试通过AVAudioPlayer
Swift 4 加载远程 MP3。到目前为止,一切都很好。
现在,我正在尝试加载我们的安全 URL,它对 URL 使用基本身份验证。
我所拥有的是:
let username = "my_username"
let password = "my_password"
let loginString = String(format: "%@:%@", username, password)
let loginData = loginString.data(using: String.Encoding.utf8)!
let base64LoginString = loginData.base64EncodedString()
// create the request
let url = URL(string: "https://audio.my_domain.com/\(hashKey)/my_file.mp3")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("Basic \(base64LoginString)", forHTTPHeaderField: "Authorization")
guard let audioPlayer = try? AVAudioPlayer(contentsOf: request) else {
self.endPlayback()
return
}
当然,我得到的错误是:
无法将“URLRequest”类型的值转换为预期的参数类型“URL”
我对此并不感到惊讶,因为 aURL
不是URLRequest
对象。所以,我的问题是。如何将 URL 流加载到AVAudioPlayer
使用基本 HTTP 身份验证中?
我似乎无法找到这样做的任何地方。也许这是不可能的?
解决方案
首先,AVAudioPlayer 并不意味着通过网络播放音频:
除非您正在播放从网络流中捕获的音频或需要非常低的 I/O 延迟,否则请使用此类进行音频播放。
您需要Data
在播放之前将完整的 mp3 文件下载到本地文件或对象中,或者使用AVPlayer
替代(旨在能够通过网络播放音频)。
为了创建一个AVPlayer
,通过网络播放音频必须首先创建一个AVURLAsset
:
let asset = AVURLAsset(url: URL(string: "https://example.com/file.mp3")!)
至少有两种方法可以通过 使用基本身份验证AVURLAsset
:
使用 AVURLAssetHTTPHeaderFieldsKey设置自定义标头。请注意,此密钥未记录在案。
将凭证添加到 shared
URLCredentialStorage
:let credential = URLCredential( user: "username", password: "password", persistence: .forSession ) let protectionSpace = URLProtectionSpace( host: "example.com", port: 443, protocol: "https", realm: nil, authenticationMethod: NSURLAuthenticationMethodHTTPBasic ) URLCredentialStorage.shared.setDefaultCredential(credential, for: protectionSpace)
然后你可以AVPlayerItem
用你的资产创建一个,最后是一个 AVPlayer:
let playerItem = AVPlayerItem(asset: asset)
let player = AVPlayer(playerItem: playerItem)
推荐阅读
- php - 混淆 CodeIgniter 路由
- javascript - 是否可以两次重用正则表达式中定义的逻辑
- python - Numpy 中的 3-D 矩阵乘法
- c# - 将 Azure Blob 存储与 .NET 结合使用
- vb.net - 我可以加入两个实体并将结果绑定到 DataGridView 以使 DataGridView 编辑可以应用于数据库吗?
- firebase - 从 firebase 模块仅导入 auth 包
- javascript - AngularJS 中的 $rootScope 与 $rootScope.$emit/$broadcast 有什么区别?
- java - 为什么 BufferedOutputStream 中的字节转换按预期工作?
- javascript - Ajax 数据表多列搜索
- c++ - 为类中的字符串 memebrs 重载 operator>> 时出错