为什么一些非常古老的AudioToolbox API(AudioComponentDescription)现在仅支持iOS 10.0+?

时间:2017-06-09 04:25:29

标签: ios audio audiounit audiotoolbox

AudioUnit已经有很长一段时间了,但是我发现很多API只支持 iOS 10.0 + ?例如,AudioComponentDescriptionkAudioOutputUnitProperty_EnableIOkAudioOutputUnitProperty_SetInputCallback

这是Apple的错误吗?我可以在iOS 10.0之前在平台上使用这些API吗?它们会被视为私有API吗?

1 个答案:

答案 0 :(得分:1)

这是我通常用来了解OS X / IOS上API的方法:

AudioComponentDescription在AudioComponent.h中定义,所以让我们找到该文件:

$ find / -name AudioComponent.h # Use sudo to avoid a lot of permission denied errors

在我的系统上,我最终得到了这些结果:

/Applications/Xcode.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/AudioToolbox.framework/Headers/AudioComponent.h
/Applications/Xcode.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/AudioUnit.framework/Headers/AudioComponent.h
/Applications/Xcode.app/Contents/Developer/Platforms/AppleTVSimulator.platform/Developer/SDKs/AppleTVSimulator.sdk/System/Library/Frameworks/AudioToolbox.framework/Headers/AudioComponent.h
/Applications/Xcode.app/Contents/Developer/Platforms/AppleTVSimulator.platform/Developer/SDKs/AppleTVSimulator.sdk/System/Library/Frameworks/AudioUnit.framework/Headers/AudioComponent.h
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/AudioToolbox.framework/Headers/AudioComponent.h
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/AudioUnit.framework/Headers/AudioComponent.h
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/Frameworks/AudioToolbox.framework/Headers/AudioComponent.h
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/Frameworks/AudioUnit.framework/Headers/AudioComponent.h
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/AudioToolbox.framework/Versions/A/Headers/AudioComponent.h
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/AudioUnit.framework/Versions/A/Headers/AudioComponent.h
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift-migrator/sdks/AppleTVOS.sdk/System/Library/Frameworks/AudioUnit.framework/Headers/AudioComponent.h
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift-migrator/sdks/AppleTVSimulator.sdk/System/Library/Frameworks/AudioUnit.framework/Headers/AudioComponent.h
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift-migrator/sdks/iPhoneOS.sdk/System/Library/Frameworks/AudioUnit.framework/Headers/AudioComponent.h
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift-migrator/sdks/iPhoneSimulator.sdk/System/Library/Frameworks/AudioUnit.framework/Headers/AudioComponent.h
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift-migrator/sdks/MacOSX.sdk/System/Library/Frameworks/AudioUnit.framework/Versions/A/Headers/AudioComponent.h

现在我们可以选择其中一个头文件,例如iPhoneOS.platform文件夹中的一个。

我们在没有任何可用性宏的情况下找到了AudioComponentDescription的定义:

typedef struct AudioComponentDescription {
    OSType              componentType;
    OSType              componentSubType;
    OSType              componentManufacturer;
    UInt32              componentFlags;
    UInt32              componentFlagsMask;
} AudioComponentDescription;

所以,这个版本似乎可用于任何IOS版本。

(我还检查了kAudioOutputUnitProperty_EnableIOkAudioOutputUnitProperty_SetInputCallback,两者都没有可用性限制)

我还使用在IOS 8.1上运行的简单Swift IOS应用程序进行了测试:

let systemVersion = UIDevice.current.systemVersion

var desc = AudioComponentDescription();
desc.componentType = kAudioOutputUnitProperty_EnableIO; // This makes no sense at all, but proves the usability
desc.componentSubType = kAudioOutputUnitProperty_SetInputCallback; // This makes no sense at all, but proves the usability

print("IOS Version: \(systemVersion)");
print(desc);

使用控制台输出:

IOS Version: 8.1
AudioComponentDescription(componentType: 2003, componentSubType: 2005, componentManufacturer: 0, componentFlags: 0, componentFlagsMask: 0)

所以,回答你的问题:

  

Apple是个错误吗?

我认为您的意思是SDK可用性,如Apple最近的在线API文档所示。 这可能不是错,但我不知道究竟是什么原因。我怀疑它与Apple最近更新所有API文档有关。 重点是,如果你想知道真正发生了什么:阅读头文件。

  

我可以在iOS 10.0之前在平台上使用这些API吗?

如上所示,是的。

  

它们会被视为私有API吗?

这可能很奇怪,因为这些是SDK文件夹中的头文件,这表明任何人都可以将它们作为提供的SDK的一部分使用。

要了解有关可用性宏的更多信息,请在其中一个SDK文件夹中读取Availability.h的内容(使用上面的搜索方法)。