joywayer
173bf79a74
3.D:VoicePlayer 远端语音播放器 + gameui_stop_voice 触发点
支撑 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 错误。
2026-06-24 01:31:52 +08:00
..
2026-06-24 01:20:30 +08:00
2026-06-24 01:20:30 +08:00
2026-06-22 21:05:23 +08:00
2026-06-24 01:29:04 +08:00
2026-06-24 01:29:04 +08:00
2026-06-24 01:29:04 +08:00
2026-06-24 01:31:52 +08:00
2026-06-24 01:29:04 +08:00