タイトル画面 消音モードでもBGM、ボイスが再生される
Description
確認した機種
- iPhone 12 mini iOS26.4.2
バージョン
https://ultemist-alpha-guide.vercel.app/
こちらから開始したtest flight
v0.1.1-284
Comments (9)
タイトル画面以外でも、同様の問題を確認しました。
また、本問題はコミット番号 9ba731c4 で、生じた問題である可能性が高そう。
修正前 実機 確認します
コミット 9ba731c4 問題点
スリープ復帰修正の本体(_recreateAudioContext)自体は問題ない。補助 hack として追加した _configureAudioSession() が想定外の副作用を持っていた。
具体的にまずかった点
navigator.audioSession.type = "playback" を設定したこと
- iOS 内部でこれは AVAudioSession のカテゴリを
.playback(音楽アプリ相当)に切り替える .playbackカテゴリはハードウェアのマナーモードスイッチを無視する仕様- その結果、ゲームが Spotify や Music.app と同じ扱いになり、マナーモードでも音が鳴り続けるようになった
なぜ見落としやすかったか
コード内のコメントには「これだけで完全に治るわけではないが、WebKit に継続再生したいと伝えるシグナルになる」と書いてあり、あくまで軽い補助として追加された。スリープ復帰という別の問題を解決しようとした副産物として、マナーモードという全く別の挙動が壊れた。
一旦、 _configureAudioSession() を削除して、根本解決の糸口を模索します。
古いバージョンでは生じていなかった本問題、最新develop 実機 でも 現象を問題再現しました。
コミット番号9ba731c4 でまずかった点は3つか?
| 変更 | 問題 |
|---|---|
_configureAudioSession() | .playback カテゴリ宣言でマナーモード無視(削除済み) |
_kickAudioSession() | new Audio().play() が同様にカテゴリを .playback に変える |
_recreateAudioContextImpl() | BGM再起動時の音量処理が不完全 |
マナーモード問題
根本原因は AppDelegate.swift の .playback カテゴリです。これはコミット 9ba731c4 より前から存在 か?
.playback はマナーモードスイッチを無視する仕様
コミット番号9ba731c4 で追加された _configureAudioSession()(削除済み)と _kickAudioSession()(new Audio().play())が、これをさらに積極的に再アサートするようになったため、症状が顕在化・悪化した
スリープ復帰後の無音問題
コミット 2b372240(revert)で interruptionNotification 購読が消えたことで、ネイティブ層での割り込み復帰処理がなくなったか?9ba731c4 はその穴をJS側のハックで埋めようとしたが、副作用だらけになったか?
現状の全体像
コミット前後の AppDelegate の差分で判明したこと
| コミット前 | コミット後(現在) | |
|---|---|---|
| AVAudioSession カテゴリ | .playback + .mixWithOthers | .playback + .mixWithOthers(変わらず) |
interruptionNotification 購読 | あり → 割り込み終了時に setActive(true) | なし(別コミット 2b372240 で消された) |
applicationDidBecomeActive | configureAudioSession() コメントアウト | 何もしない(コミット後に戻された) |
.playback の問題はいずれにしても、直そう
修正プラン
Step 1:AppDelegate.swift — カテゴリを .ambient に変更 + interruption 購読を復活
// .playback → .ambient に変更(マナーモード尊重)
try? AVAudioSession.sharedInstance().setCategory(.ambient, options: [.mixWithOthers])
// interruption 購読を復活(2b372240 で消えた分を戻す)
NotificationCenter.default.addObserver(
self,
selector: #selector(handleAudioSessionInterruption),
name: AVAudioSession.interruptionNotification,
object: AVAudioSession.sharedInstance()
)
Step 2:sound.ts — _kickAudioSession() を削除
new Audio().play() がネイティブ側で AVAudioSession カテゴリを .playback に引き戻すリスクがあるため削除する予定。
new Audio() は、やめてください。 soundマネージャー経由で音をならすようにしてください。
Step 3:sound.ts — _recreateAudioContextImpl() の BGM 音量を修正
BGM 再起動時の音量が上昇する箇所を特定・修正する方向
Step 4:実機確認
- マナーモード消音
- スリープ復帰後の BGM 再生
- 「ぷーん」音の有無
- BGM 音量が正常か
- コミット番号 9147e660 (05-06) 時点 ユーザー最後の修正 → setCategory なし → マナーモード ✅ 良好だった。
- コミット番号 c7b95eed (05-16) "イベントとオーディオの調整" → .playback 追加 → マナーモード ❌
- コミット番号 9ba731c4(05-17) "iOSスリープ復帰修正" → _kickAudio, _configureAudioSession 追加で悪化
- コミット番号 c7b95eed "イベントとオーディオの調整"(2026-05-16, shirakawayohane) このコミットで AVAudioSession.setCategory(.playback, ...) が新規追加されたことが根本原因か。