watchOS独立播放HLS直播音频故障求助
Apple Watch独立播放HLS直播音频问题解决
问题场景
需要实现Apple Watch脱离配对手机独立播放HLS直播音频,目前手机在场时可正常启动流播放,但手机不在附近时,watchOS无法独立触发播放(目标是实现类似Spotify或Apple Music的独立播放能力)。已学习2019年WWDC流媒体相关内容及watchOS后台音频官方文档,开启了后台音频模式,但调用路由选择器选择AirPods等输出设备后,音频流并未启动。
现有排查信息
运行日志
- [Routing] Presenting route picker alert for audioSessionID: 401593
- AVAudioSession激活成功(success变量为true)
- 无错误返回(error变量为nil)
- 目标流地址:
https://listen.powerapp.com.tr/powerfm/abr/playlist.m3u8
当前核心代码
do { try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, policy: .longFormAudio, options: []) } catch { print("no audiosession!") } AVAudioSession.sharedInstance().activate(options: []) { success, error in dump(success) dump(error) DispatchQueue.main.async { if let streamURL = moduleItem.media?[0] as? String { dump(streamURL) let asset = AVURLAsset(url: URL(string: streamURL)!, options: nil) let item = AVPlayerItem(asset: asset) let player = AVQueuePlayer(playerItem: item) player.play() } } }
针对性解决方案
1. 修复播放器生命周期问题
当前代码中AVQueuePlayer是回调内的局部变量,回调执行完毕后会被系统回收,导致播放无法持续。必须将播放器声明为类属性或全局变量,确保其生命周期覆盖整个播放过程:
// 在类内部声明播放器属性 private var player: AVQueuePlayer? // 初始化播放逻辑时赋值 self.player = AVQueuePlayer(playerItem: item) self.player?.play()
2. 适配watchOS的HLS流格式
部分HLS流可能包含watchOS不支持的音频编码,建议优先使用AAC-LC编码。可通过以下代码检查流的兼容性:
asset.loadTracks(withMediaType: .audio) { tracks, error in guard let audioTrack = tracks?.first else { return } let formatDesc = audioTrack.formatDescriptions.first as! CMFormatDescription let mediaSubtype = CMFormatDescriptionGetMediaSubType(formatDesc) print("当前音频编码:\(mediaSubtype)") // 验证是否为watchOS支持的编码(如kAudioFormatMPEG4AAC) }
3. 完善后台音频配置
除代码中的音频会话设置,还需确认:
- 在watchOS应用的
Info.plist中添加UIBackgroundModes数组,包含audio字段 - 若直播场景下
longFormAudio策略适配不佳,可尝试简化音频会话配置:try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [.allowAirPlay])
4. 监听路由切换并触发播放
路由选择完成后,需主动重新触发播放逻辑。可通过监听音频路由变更通知实现:
// 在初始化方法中添加监听 NotificationCenter.default.addObserver( self, selector: #selector(handleAudioRouteChange), name: AVAudioSession.routeChangeNotification, object: nil ) // 实现通知处理方法 @objc private func handleAudioRouteChange(notification: Notification) { guard let player = self.player, !player.isPlaying else { return } player.play() }
5. 确保watchOS独立联网权限
若依赖蜂窝网络播放,需在watchOS应用的权限设置中开启蜂窝数据权限,同时确认Info.plist中的ATS配置允许目标流地址的网络请求。
内容的提问来源于stack exchange,提问作者Baris Yazganc
相关产品推荐
相关产品推荐

