AudioUnitInitialize 在 iOS 模拟器上导致允许麦克风访问提示

AudioUnitInitialize causes Allow Microphone access prompt on iOS Simulator

我正在使用 AudioUnit 从 TeamSpeak 服务器播放音频,但是当我在 iOS 模拟器上调用 AudioUnitInitialize 时,我不断收到 macOS 提示允许麦克风即使我只想播放也可以访问。

在真实设备上一切正常,没有任何本机提示,但在模拟器中 运行 运行应用程序时真的很烦人,因为每次我 运行 应用程序时都会出现此提示。

- (void)setupRemoteIO
{
    AudioUnit audioUnit;
    // Describe audio component
    AudioComponentDescription desc;
    desc.componentType = kAudioUnitType_Output;
    desc.componentSubType = kAudioUnitSubType_RemoteIO;
    desc.componentFlags = 0;
    desc.componentFlagsMask = 0;
    desc.componentManufacturer = kAudioUnitManufacturer_Apple;

    // Get component
    AudioComponent inputComponent = AudioComponentFindNext(NULL, &desc);

    // Get audio unit
    OSStatus status = AudioComponentInstanceNew(inputComponent, &audioUnit);
    if (status != noErr)
    {
        printf("AudioIO could not create new audio component: status = %i\n", status);
    }

    UInt32 enableIO;
    AudioUnitElement inputBus = 1;
    AudioUnitElement outputBus = 0;
    //Disabling IO for recording
    enableIO = 0;

    AudioUnitSetProperty(audioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, inputBus, &enableIO, sizeof(enableIO));

    //Enabling IO for playback
    enableIO = 1;
    AudioUnitSetProperty(audioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Output, outputBus, &enableIO, sizeof(enableIO));

    // initialize
    status = AudioUnitInitialize(audioUnit);
    if (status != noErr)
    {
        printf("AudioIO could not initialize audio unit: status = %i\n", status);
    }
}

这是来自 macOS Mojave 的 Xcode(10.2 之前版本)的一个已知错误(我说已知是因为我在播放视频时遇到过很多次,但也因为当我在寻找它时我发现很多人有同样的问题);虽然我找不到苹果的任何报告。 根据环境、启动应用程序的方式、Xcode 的版本和您拥有的 macOS Mojave 版本,可能会有一些解决方法。

这只会在模拟器中发生,正如您所说,它不会在真实设备上发生,因为大多数应用不需要麦克风访问权限来播放 Audio/Video 功能。

在此期间此错误得到解决,您可以尝试:

  1. 前往 macOS 上的 "Security & Privacy" 设置

  2. 左侧面板
  3. "Microphone"

  4. 然后在右侧面板 disable Xcode

  5. 的选项

您可以尝试摆脱该消息的另一件事是将硬件音频输入更改为内部麦克风:

Xcode10.2 更新:

You’re now only prompted once to authorize microphone access to all simulator devices. (45715977)