AudioKit 5.2.2启动未获麦克风权限 后续授权后仍无法正常使用问题
问题根因
AudioKit 5.2.2底层依赖的系统AVAudioEngine组件,会在应用首次启动时初始化输入节点的配置,如果此时没有麦克风权限,系统会返回无效的输入采样格式,哪怕后续用户授予了权限,已经实例化的AudioEngine和关联的输入节点也不会自动刷新配置,因此不会产生任何输入回调。
你当前的代码逻辑中如果AudioEngine已经初始化过就会复用旧实例,如果应用启动后、权限授予前你触发过AudioEngine的初始化逻辑(哪怕只是判断engine.input是否存在),后续权限授予后复用旧实例就会触发这个问题。
修复方案
- 权限授予前绝对不要初始化任何AudioKit相关实例,包括AudioEngine、Mixer、Tap等,所有实例初始化逻辑都必须放在权限确认授权之后执行。
- 每次权限状态变更为已授权时,销毁所有旧的AudioKit实例,完全重新初始化,不要复用任何之前创建的对象。
- 补充完全销毁实例的方法,避免旧实例残留。
修改后的代码
var engine: AudioEngine? var silencer: Fader? var mixer: Mixer? var tracker: AmplitudeTap? func setup() -> Bool { // 每次setup先清空旧实例,完全重新初始化 destroyAllAudioInstances() engine = AudioEngine() mixer = Mixer() guard let input = engine?.input else { return false } silencer = Fader(input, gain: 0) engine?.output = mixer tracker = AmplitudeTap(input) { amplitude in DispatchQueue.main.async { print("amplitude: \(amplitude)") } } return true } func start() { do { try tracker?.start() try engine?.start() } catch let err { print(err) } } func stop() { engine?.stop() tracker?.stop() destroyAllAudioInstances() } // 新增销毁所有音频实例的私有方法 private func destroyAllAudioInstances() { tracker?.dispose() tracker = nil silencer = nil mixer?.removeAllInputs() mixer = nil engine?.output = nil engine = nil }
注意事项
确认Flutter侧请求麦克风权限的回调,是在用户点击允许之后才调用原生侧的setup方法,不要在权限请求还没返回结果的时候提前初始化任何AudioKit对象。如果仍无回调,可以在setup方法中打印AVAudioSession.sharedInstance().inputAvailable和engine.input.inputFormat(forBus: 0)的参数,确认授权后输入格式的采样率、通道数是否正常。
内容的提问来源于stack exchange,提问作者Nazarii Kahaniak
相关产品推荐
相关产品推荐

