为啥一些非常老的 AudioToolbox API (AudioComponentDescription) 现在只支持 iOS 10.0+?

Posted

技术标签:

【中文标题】为啥一些非常老的 AudioToolbox API (AudioComponentDescription) 现在只支持 iOS 10.0+?【英文标题】:Why some very old AudioToolbox APIs (AudioComponentDescription) supports only iOS 10.0+ now?为什么一些非常老的 AudioToolbox API (AudioComponentDescription) 现在只支持 iOS 10.0+? 【发布时间】:2017-06-09 04:25:28 【问题描述】:

AudioUnit 已经上线很久了,但是我发现很多API只支持iOS 10.0+?例如,AudioComponentDescriptionkAudioOutputUnitProperty_EnableIOkAudioOutputUnitProperty_SetInputCallback

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

【问题讨论】:

【参考方案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 最近的在线 API 文档中显示的 SDK 可用性。 应该不会错,但不知道具体的原因是什么。我怀疑这与 Apple 最近更新所有 API 文档有关。 关键是,如果你想知道到底发生了什么:阅读头文件。

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

如上图,是的。

它们会被视为私有 API 吗?

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

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

【讨论】:

很好的答案!你的意思是如果没有可用性宏就可以安全使用吗? 是的,否则您会看到类似__OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_2_0) 的内容(从 OS X 10.6 和 IOS 2.0 开始可用)。或__OSX_AVAILABLE_STARTING(__MAC_10_11, __IPHONE_NA)(从 OS X 10.11 开始可用,在 IOS 上不可用)。或__OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_3, __MAC_10_7, __IPHONE_2_0, __IPHONE_4_1)(适用于 OS X 10.3 至 10.7,IOS 2.0 至 4.1) 但是我觉得有更好的方法来查找方法和头文件,在XCode中使用COMMAND+SHIFT+O很方便。 确实很方便!

以上是关于为啥一些非常老的 AudioToolbox API (AudioComponentDescription) 现在只支持 iOS 10.0+?的主要内容,如果未能解决你的问题,请参考以下文章

iOS - AudioToolbox 内存泄漏

如何使用谷歌地图 api 获得速度限制?

使用 AudioToolbox - Swift 从音频信号中获取原始样本流

老的API实现WordCount

为啥 Postman 找不到我的 Spring REST API?

HDFS API详解-很老的版本