import UIKit import Flutter import AVFoundation @main @objc class AppDelegate: FlutterAppDelegate, FlutterImplicitEngineDelegate { override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { // Configure the iOS AVAudioSession for voice chat BEFORE Flutter // starts the audio engine. The category + mode combination tells // iOS to: // * route via the receiver/speaker like a phone call // (`.playAndRecord` + `.voiceChat`) // * engage hardware AEC / NS where the device supports it // * default the speaker output (so the user doesn't have to // hold the phone to their ear) // * permit Bluetooth headsets (so AirPods et al. just work) // // SRS-197 covers the iOS audio routing contract; this is the // matching iOS-side implementation. Failures are logged but do // not block app launch — the audio engine will still come up, // just at the iOS default playback route. do { let session = AVAudioSession.sharedInstance() try session.setCategory( .playAndRecord, mode: .voiceChat, options: [.defaultToSpeaker, .allowBluetooth, .allowBluetoothA2DP] ) try session.setActive(true, options: []) NSLog("chanora_flutter: AVAudioSession configured (playAndRecord/voiceChat)") } catch { NSLog("chanora_flutter: AVAudioSession setup failed: \(error)") } return super.application(application, didFinishLaunchingWithOptions: launchOptions) } func didInitializeImplicitFlutterEngine(_ engineBridge: FlutterImplicitEngineBridge) { GeneratedPluginRegistrant.register(with: engineBridge.pluginRegistry) } }