SwiftUI中如何通过URL链接而非本地.mp3文件播放音频
解决方案
可以直接通过URL播放网络音频,你当前代码无法实现的核心原因是AVAudioPlayer仅支持加载本地文件资源,不支持远程网络URL加载,同时代码还存在方法名不匹配、资源读取逻辑错误的问题,改用AVPlayer即可实现需求。
可直接运行的修改后代码
import SwiftUI import AVFoundation struct AudioTest: View { @State private var song1 = false // 用AVPlayer替代AVAudioPlayer支持远程播放 @State private var audioPlayer: AVPlayer? var body: some View { Image(systemName: song1 ? "pause.circle.fill": "play.circle.fill") .font(.system(size: 25)) .padding(.trailing) .onTapGesture { // 首次点击时初始化播放器 if audioPlayer == nil { guard let url = URL(string: "https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3") else { print("无效的音频链接") return } let playerItem = AVPlayerItem(url: url) audioPlayer = AVPlayer(playerItem: playerItem) } song1.toggle() if song1 { audioPlayer?.play() } else { audioPlayer?.pause() } } } } struct AudioTest_Previews: PreviewProvider { static var previews: some View { AudioTest() } }
注意事项
- 如果需要加载HTTP协议的音频链接,需要在项目的Info.plist中添加配置:新增
App Transport Security Settings字典,在字典内添加Allow Arbitrary Loads字段并设为YES,否则系统会默认拦截HTTP请求。 - 网络音频播放依赖网络状态,建议后续补充加载状态提示、播放失败异常处理逻辑,优化用户体验。
- 播放器实例建议不要定义为全局变量,正式项目中可以放在
@StateObject修饰的视图模型中管理,避免出现内存泄漏、多页面播放冲突的问题。
内容的提问来源于stack exchange,提问作者DQ Vlodavitch
相关产品推荐
相关产品推荐

