fix(iOS): don't set isInitialized flag when skipping Web Audio on iOS

Previously, the code was setting isInitialized = true on iOS even though
no AudioContext was created. This caused isReady() to return true, which
led other code to try to use the non-existent audio context.

Now isInitialized remains false on iOS, so isReady() returns false and
the code properly falls back to using the standard HTMLAudioElement APIs.
This commit is contained in:
Eduard Prigoana 2026-02-14 18:01:25 +00:00 committed by Julien Maille
parent d7dde87023
commit b47e11ef48

View file

@ -133,6 +133,8 @@ class AudioContextManager {
if (this.isInitialized) return; if (this.isInitialized) return;
if (!audioElement) return; if (!audioElement) return;
this.audio = audioElement;
// Detect iOS - skip Web Audio initialization on iOS to avoid lock screen audio issues // Detect iOS - skip Web Audio initialization on iOS to avoid lock screen audio issues
// iOS suspends AudioContext when screen locks, and MediaSession controls don't count // iOS suspends AudioContext when screen locks, and MediaSession controls don't count
// as user gestures to resume it, causing audio to play silently // as user gestures to resume it, causing audio to play silently
@ -140,13 +142,12 @@ class AudioContextManager {
const isIOS = /iphone|ipad|ipod/.test(ua) || (ua.includes('mac') && navigator.maxTouchPoints > 1); const isIOS = /iphone|ipad|ipod/.test(ua) || (ua.includes('mac') && navigator.maxTouchPoints > 1);
if (isIOS) { if (isIOS) {
console.log('[AudioContext] Skipping Web Audio initialization on iOS for lock screen compatibility'); console.log('[AudioContext] Skipping Web Audio initialization on iOS for lock screen compatibility');
this.isInitialized = true; // Mark as initialized to prevent repeated attempts // Don't set isInitialized - let it remain false so isReady() returns false
// This prevents other code from trying to use the non-existent audio context
return; return;
} }
try { try {
this.audio = audioElement;
const AudioContext = window.AudioContext || window.webkitAudioContext; const AudioContext = window.AudioContext || window.webkitAudioContext;
this.audioContext = new AudioContext(); this.audioContext = new AudioContext();
@ -313,10 +314,10 @@ class AudioContextManager {
} }
/** /**
* Check if initialized * Check if initialized and active
*/ */
isReady() { isReady() {
return this.isInitialized; return this.isInitialized && this.audioContext !== null;
} }
/** /**