173bf79a7419469cab09e44c729b8123fd2a6f04
支撑 Phase 3.F mediaTypeAudio handler 的播放子链路。 ## 行为对齐原项目 - `lastUserId`:mediaTypeAudio 入参 user 字段,每次进来都更新(无论 voicePlaying=1/0、无论是否实际播放),对齐 daoqi gameController.m:438 `self.User_id=userid;` 总是执行的行为 - `gameui_stop_voice` payload 用 `lastUserId`,**不**是 didFinishPlaying 传入的 player 关联值(多条消息连发时 stop 发最新 user,与 daoqi 行为 一致——这是原项目的"特征",不是 bug) - 覆盖式 play:前一条还在播时收到第二条直接替换 player(对齐 daoqi `voicePlayer = [[AVAudioPlayer alloc]...]` ARC 覆盖行为) - 主动 stop 不触发 onFinish(daoqi 没有主动 stop 路径) ## Swift 6 并发处理 AVAudioPlayerDelegate 方法签名 nonisolated;AVAudioPlayer 是 non-Sendable 不能跨 actor 传递。用 ObjectIdentifier(Sendable)传递 身份,handleFinish 在 MainActor 内重新查 self.player 比对身份。 防御覆盖式 play 时旧 player stop 触发延迟 delegate:仅当 didFinish 的 player 与当前 self.player 同身份时才清理 + 触发 onFinish。 ## 验证 BuildProject 通过 0 错误。
Description
No description provided
24 MiB
Languages
Swift
94.5%
Objective-C++
2.9%
JavaScript
1.8%
C
0.6%
Objective-C
0.2%