Files
BizGaze_Remote/mobile/scripts/inject-audio.js
T

37 lines
2.2 KiB
JavaScript
Raw Normal View History

// Inject an AVAudioSession "default to the loudspeaker" setup into the freshly-generated Capacitor iOS
// AppDelegate, so calls don't route to the quiet earpiece. Run on Codemagic (macOS) from ios-patch.sh:
// node mobile/scripts/inject-audio.js mobile/ios/App/App/AppDelegate.swift
// TOLERANT by design: if the file is missing or the template doesn't match, it prints a note and exits 0
// so it can NEVER fail the build. First-pass fix — if iOS WebRTC re-grabs the session mid-call on device,
// we follow up with a plugin that re-asserts .overrideOutputAudioPort(.speaker).
const fs = require('fs');
const p = process.argv[2];
if (!p || !fs.existsSync(p)) { console.log(' (AppDelegate.swift not found — AVAudioSession patch skipped)'); process.exit(0); }
try {
let s = fs.readFileSync(p, 'utf8');
if (s.includes('AVAudioSession')) { console.log(' AVAudioSession already patched'); process.exit(0); }
const orig = s;
if (s.includes('import Capacitor')) s = s.replace('import Capacitor', 'import Capacitor\nimport AVFoundation');
else if (s.includes('import UIKit')) s = s.replace('import UIKit', 'import UIKit\nimport AVFoundation');
const inject = [
' // Default call audio to the loudspeaker (iOS uses the quiet earpiece otherwise).',
' do {',
' let audioSession = AVAudioSession.sharedInstance()',
' try audioSession.setCategory(.playAndRecord, mode: .voiceChat, options: [.defaultToSpeaker, .allowBluetooth, .allowBluetoothA2DP])',
' try audioSession.setActive(true)',
' } catch { }',
'',
].join('\n');
const m = s.match(/func\s+application\([^)]*didFinishLaunchingWithOptions[^)]*\)\s*->\s*Bool\s*\{[^\n]*\n/);
if (m) { const idx = m.index + m[0].length; s = s.slice(0, idx) + inject + s.slice(idx); }
if (s !== orig && s.includes('AVAudioSession')) {
fs.writeFileSync(p, s);
console.log(' AVAudioSession default-to-speaker injected into AppDelegate');
} else {
console.log(' (AppDelegate pattern not matched — AVAudioSession patch skipped)');
}
} catch (e) {
console.log(' (AVAudioSession patch error, skipped: ' + (e && e.message) + ')');
}
process.exit(0);