为什么一些非常古老的 AudioToolbox API (AudioComponentDescription) 现在只支持 iOS 10.0+?
Why some very old AudioToolbox APIs (AudioComponentDescription) supports only iOS 10.0+ now?
AudioUnit
已经有很长时间了,但是我发现很多API只支持iOS 10.0+?例如,AudioComponentDescription
, kAudioOutputUnitProperty_EnableIO
, kAudioOutputUnitProperty_SetInputCallback
。
难道是苹果的失误?我可以在 iOS 10.0 之前的平台上使用这些 API 吗?他们会被视为私人 API 吗?
这是我通常用来在 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_EnableIO
和 kAudioOutputUnitProperty_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)
因此,回答您的问题:
Is it a mistake by Apple?
我假设您指的是 Apple 最近在线 API 文档中显示的 SDK 可用性。
应该不会出错,但不知道具体原因是什么。我 怀疑 这与 Apple 最近更新了他们所有的 API 文档有关。
重点是,如果你想知道到底发生了什么:阅读头文件。
Can I use these APIs on the platform before iOS 10.0?
如上图,是的
Would they be treated as private API?
这很奇怪,因为这些是 SDK 文件夹中的头文件,这表明任何人都可以将它们用作提供的 SDK 的一部分。
要了解有关可用性宏的更多信息,请阅读其中一个 SDK 文件夹中 Availability.h 的内容(使用上述搜索方法)。
AudioUnit
已经有很长时间了,但是我发现很多API只支持iOS 10.0+?例如,AudioComponentDescription
, kAudioOutputUnitProperty_EnableIO
, kAudioOutputUnitProperty_SetInputCallback
。
难道是苹果的失误?我可以在 iOS 10.0 之前的平台上使用这些 API 吗?他们会被视为私人 API 吗?
这是我通常用来在 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_EnableIO
和 kAudioOutputUnitProperty_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)
因此,回答您的问题:
Is it a mistake by Apple?
我假设您指的是 Apple 最近在线 API 文档中显示的 SDK 可用性。 应该不会出错,但不知道具体原因是什么。我 怀疑 这与 Apple 最近更新了他们所有的 API 文档有关。 重点是,如果你想知道到底发生了什么:阅读头文件。
Can I use these APIs on the platform before iOS 10.0?
如上图,是的
Would they be treated as private API?
这很奇怪,因为这些是 SDK 文件夹中的头文件,这表明任何人都可以将它们用作提供的 SDK 的一部分。
要了解有关可用性宏的更多信息,请阅读其中一个 SDK 文件夹中 Availability.h 的内容(使用上述搜索方法)。