原文:http://book.2cto.com/201403/41492.html
表2-2列出了OS X和iOS中的框架,并且列出了开始支持这些框架的操作系统版本。版本号信息取自于苹果的官方文档[3,4],在官方文档中也能找到类似的表格(而且还有可能更新)。这些框架具有很多重合度,有很多框架从OS X移植到了iOS,还有一些框架从iOS移植回OS X(例如CoreMedia)。在Mountain Lion中从iOS移植的框架更多,例如Game Center和Twitter都是从iOS移植的框架。此外,还有一些OS X的框架在iOS中以私有框架的形式存在。
表2-2 Mac OS X和iOS中的公共框架
框 架 | OS X版本 | iOS版本 | 作 用 |
AGL | 10.0 | -- | OpenGL的Carbon接口 |
Accounts | 10.8 | 5.0 | 用户账号数据库——用于支持单点登录 |
Accelerate | 10.3 | 4.0 | 加速的向量操作 |
AddressBook | 10.2 | 2.0 | 地址簿相关的功能 |
AddressBookUI | -- | 2.0 | 显示联络人信息的UI(iOS) |
AppKit | 10.0 | -- | Cocoa的主要库之一(由Cocoa.Framework依赖),本身是其他库的保护伞。还包含XPC(在iOS中为私有框架) |
AppKitScripting | 10.0 | -- | 被Appkit替代 |
AppleScriptKit | 10.0 | -- | AppleScript的插件 |
AppleScriptObjC | 10.0 | -- | AppleScript的基于Objective-C的插件 |
AppleShareClientCore | 10.0 | -- | AFP客户端实现 |
AppleTalk | 10.0 | -- | AFP协议的核心实现 |
框 架 | OS X版本 | iOS版本 | 作 用 |
ApplicationServices | 10.0 | -- | CoreGraphics、CoreText、ColorSync和其他一些框架的保护伞框架(仅头文件),还包含 SpeechSynthesis(这是作者的最爱) |
AudioToolBox | 10.0 | 2.0 | 音频录制/处理以及其他相关功能 |
AssetsLibrary | -- | 4.0 | 照片和视频 |
AudioUnit | 10.0 | 2.0 | 音频单元(插件)和编解码器 |
AudioVideoBridging | 10.8 | -- | AirPlay |
AVFoundation | 10.7 | 2.2 | 对于音频/视频媒体的Objective-C支持。最近才移植到Lion |
Automator | 10.4 | -- | Automator插件支持 |
CalendarStore | 10.5 | -- | iCal支持 |
Carbon | 10.0 | -- | OS 9的遗产API Carbon的保护伞框架(仅头文件) |
Cocoa | 10.0 | -- | Cocoa API的保护伞框架(仅头文件),包含AppKit、CoreData和Foundation |
Collaboration | 10.5 | -- | CBIdentity*系列API |
CoreAudio | 10.0 | 2.0 | 音频抽象层 |
CoreAudioKit | 10.4 | -- | 音频的Objective-C接口 |
CoreBlueTooth | -- | 5.0 | 蓝牙相关的API |
CoreData | 10.4 | 3.0 | 数据模型,包含NSEntityMappings等 |
CoreFoundation | 10.0 | 2.0 | 从字面上可以理解,向其他所有框架提供基础数据结构(各种CF开头的类)的核心框架 |
CoreLocation | 10.6 | 2.0 | GPS相关的服务 |
CoreMedia | 10.7 | 4.0 | 音频和视频相关的底层例程 |
CoreMediaIO | 10.7 | -- | CoreMedia的抽象层 |
CoreMIDI | 10.0 | -- | MIDI客户端接口 |
CoreMIDIServer | 10.0 | -- | MIDI驱动程序接口 |
CoreMotion | -- | 4.0 | 加速度计和陀螺仪相关的接口 |
CoreServices | 10.0 | -- | AppleEvents、Bonjour、Sockets、Spotlight、FSEvents以及很多其他服务框架的保护伞框架(嵌套的子框架) |
CoreTelephony | -- | 4.0 | 电话相关的数据 |
CoreText | 10.5 | 3.2 | 文本和字体相关的框架。在OS X中这是 ApplicationServices框架中的子框架 |
CoreVideo | 10.5 | 4.0 | 被其他库使用的视频格式支持 |
CoreWifi | 10.8 | P | 在iOS中,这个框架称为“MobileWiFi”,而且是私有的框架 |
框 架 | OS X版本 | iOS版本 | 作 用 |
CoreWLAN | 10.6 | -- | 无线LAN(WiFi)相关的框架 |
DVComponentGlue | 10.0 | -- | 数字视频录制器/相机 |
DVDPlayback | 10.3 | -- | DVD播放 |
DirectoryService | 10.0 | -- | LDAP访问 |
DiscRecording | 10.2 | -- | 光盘烧录相关的库 |
DiscRecordingUI | 10.2 | -- | 光盘烧录相关的库和用户界面 |
DiskArbitration | 10.4 | -- | 系统卷管理器DiskArbitrationD的接口 |
DrawSprocket | 10.0 | -- | Sprocket组件 |
EventKit | 10.8 | 4.0 | Calendar支持 |
EventKitUI | -- | 4.0 | Calendar用户界面 |
ExceptionHandling | 10.0 | -- | Cocoa异常处理 |
ExternalAccessory | -- | 3.0 | 处理插在iPad/iPod/iPhone上的硬件配件的库 |
FWAUserLib | 10.2 | -- | 火线音频库 |
ForceFeedback | 10.2 | -- | 处理力反馈功能的设备(游戏杆、游戏板等) |
Foundation | 10.0 | 2.0 | 底层数据结构支持 |
GameKit | 10.8 | 3.0 | 游戏的点对点连接 |
GLKit | 10.8 | 5.0 | OpenGLES辅助库 |
GLUT | 10.0 | -- | OpenGL Utility框架 |
GSS | 10.7 | 5.0 | Generic Security Services API(RFC2078),带有一些苹果私有的扩展 |
iAd | -- | 4.0 | 苹果的移动广告分发系统 |
ICADevices | 10.3 | -- | 扫描仪/照相机相关的库(类似于TWAIN) |
IMCore | 10.6 | -- | 由InstantMessaging内部使用 |
ImageCaptureCore | 10.6 | P | 替代了之前的ImageCapture |
ImageIO | -- | 4.0 | 图像格式的读写 |
IMServicePlugin | 10.7 | -- | iChat服务提供者 |
InputMethodKit | 10.5 | -- | 替换的输入方法 |
InstallerPlugins | 10.4 | -- | 系统安装器插件 |
InstantMessage | 10.4 | M | 即时消息和iChat |
IOBluetooth | 10.2 | -- | OS X的蓝牙支持 |
IOBluetoothUI | 10.2 | -- | OS X的蓝牙支持 |
IOKit | 10.0 | 2.0 | 设备驱动程序的用户态组件 |
框 架 | OS X版本 | iOS版本 | 作 用 |
IOSurface | 10.6 | P | 在应用程序之间共享图像 |
JavaEmbedding | 10.0~10.7 | -- | 在Carbon中嵌入Java。在Lion和更新的版本中不再支持 |
JavaFrameEmbedding | 10.5 | -- | 在Cocoa中嵌入Java |
JavaScriptCore | 10.5 | 5.0 | Safari和其他WebKit程序使用的JavaScript解释器 |
JavaVM | 10.0 | -- | Java运行时库的苹果移植 |
Kerberos | 10.0 | -- | 提供Kerberos支持(Active Directory整合和一些UNIX域要求这项支持) |
Kernel | 10.0 | -- | 内核扩展所需要的框架 |
LDAP | 10.0 | P | 最早的LDAP支持,被OpenDirectory所替代 |
LatentSemanticMapping | 10.5 | -- | 隐含语义映射 |
MapKit | -- | 4.0 | 嵌入地图和地理信息编码数据 |
MediaPlayer | -- | 2.0 | iPod播放器界面和电影播放界面 |
MediaToolbox | 10.8 | P | |
Message | 10.0 | P | 电子邮件消息的支持 |
MessageUI | -- | 3.0 | 发送消息和Mail.app(ComposeView和其他相关的视图)的UI资源 |
MobileCoreServices | -- | 3.0 | 精简版的CoreServices |
Newsstandkit | -- | 5.0 | 支持iOS 5.0引入的“Newsstand” |
NetFS | 10.6 | -- | 网络文件系统(AFP、NFS) |
OSAKit | 10.4 | -- | Cocoa中整合OSA脚本的支持 |
OpenAL | 10.4 | 2.0 | 跨平台音频库 |
OpenCL | 10.6 | P | GPU/并行编程框架 |
OpenDirectory | 10.6 | -- | Open Directory(LDAP)的Objective-C绑定 |
OpenGL | 10.0 | -- | OpenGL——3D图形支持。在受支持的芯片组上链接至OpenCL |
OpenGLES | -- | 2.0 | 嵌入式OpenGL——在iOS上替换OpenGL |
PCSC | 10.0 | -- | 智能卡的支持 |
PreferencePanes | 10.0 | -- | System Preference面板支持。System Preference中的面板实际上都是保存在/System/Library/PreferencePanes目录下的bundle |
PubSub | 10.5 | -- | RSS/Atom支持 |
Python | 10.3 | -- | Python脚本语言 |
QTKit | 10.4 | -- | QuickTime支持 |
Quartz | 10.4 | -- | 保护伞框架,包括PDF支持、ImageKit、QuartzComposer、QuartzFilter和QuickLookUI。负责系统中大部分2D图形的绘制 |
框 架 | OS X版本 | iOS版本 | 作 用 |
QuartzCore | 10.4 | 2.0 | Quartz和Core相关的框架之间的接口 |
QuickLook | 10.5 | 4.0 | 文件预览和缩略图生成 |
QuickTime | 10.0 | -- | Quicktime嵌入 |
Ruby | 10.5 | -- | 流行的脚本语言Ruby |
RubyCocoa | 10.5 | -- | Ruby语言的Cocoa绑定 |
SceneKit | 10.8 | -- | 3D渲染。在Lion中是私有框架,但是在Mountain Lion中成为了公共框架 |
ScreenSaver | 10.0 | -- | 屏幕保护相关的API |
Scripting | 10.0 | -- | 最早的脚本框架,现已废弃 |
ScriptingBridge | 10.5 | -- | Objective-C语言的脚本适配器 |
Security | 10.0 | 3.0 | 证书、密钥和安全随机数等的支持 |
SecurityFoundation | 10.0 | -- | SF*系列认证 |
SecurityInterface | 10.3 | -- | 证书、认证和钥匙链相关的用户界面的SF*系列头文件 |
ServerNotification | 10.6 | -- | Notficiation支持 |
ServiceManagement | 10.6 | -- | launchd的接口 |
StoreKit | 10.7 | 3.0 | 应用内购的支持 |
SyncServices | 10.4 | -- | 和.Mac同步日历 |
System | 10.0 | 2.0 | 其他框架内部使用的框架 |
SystemConfiguration | 10.0、10.3 | 2.0 | 包含SCNetwork和SCDynamicStore |
TWAIN | 10.2 | -- | 扫描仪支持 |
10.8 | 5.0 | Twitter支持(在iOS 5中) | |
Tcl | 10.3 | -- | TCL解释器 |
Tk | 10.4 | -- | Tk Toolkits |
UIKit | -- | 2.0 | Cocoa Touch——AppKit在iOS上的替代 |
VideoDecodeAcceleration | 10.6.3 | -- | 通过GPU进行H.264加速(TN2267) |
VideoToolkit | 10.8 | P | 替代QuickTime图像压缩管理器,提供视频格式支持 |
WebKit | 10.2 | P | HTML渲染(Safari的核心) |
XgridFoundation | 10.4~10.7 | -- | Xgrid集群(在Mountain Lion中被移除) |
vecLib | 10.0 | -- | 向量计算(Accelerate的子框架) |
练习:演示框架的强大
OS X的框架真是技术的奇迹。不论从什么角度看,框架的精巧设计和可重用性都是超群的。图形相关的框架中有很多出色的例子,但是SpeechSynthesis.Framework框架的例子是真正有用而且同样令人印象深刻的。
利用这个框架,可以快速简单地将Text-to-Speech特性嵌入到程序中,充分利用苹果已经实现(大部分由苹果实现,而且由苹果完善)的复杂逻辑。/System/Library/Speech目录下面包含Synthesizers(合成器)目录(Mountain Lion中包含两个:MacinTalk和MultiLingual),其中包含的都是Mach-O格式的二进制bundle。这些bundle可以像库一样加载至几乎任何进程中。此外,还有一些预编程好的声音(在Voices/子目录中)和Recognizers(识别器,用于Speech-to-Text)。声音将音高和其他语音参数编码在一种自主产权的二进制格式中。在苹果开发者文档“The Speech Synthesis API”中对此有详细描述。苹果还提供了一个很酷的工具用于自定义语音:“Repeat After Me”(这是Xcode的一部分,位于/Developer/Applications/Utilities/ Speech/Repeat After Me)。
然而一般的开发者却不需要关心这些。通过SpeechSynthesis.Framework框架(当然也有其他方法)可以访问语音合成器,这个框架本身位于ApplicationServices框架(对于Carbon)或AppKit(对于Cocoa)。通过使用这个框架,一个C语言或Objective-C语言的应用程序可以利用区区数行代码实现Text-to-Speech的功能(使用系统中提供的多种声音中的一种声音),下面的例子就演示了如何实现这一点。这个例子展示了一个利用OS X提供的Text-to-Speech功能的简单示例(这个例子比较简单粗暴)。
为了避免涉及凌乱的Objective-C语法,代码清单2-3列出的示例代码使用的是C语言,因此使用的是ApplicationServices框架而不是AppKit框架。
代码清单2-3:演示如何简单地实现say(1)实用工具的(部分)功能
#include <ApplicationServices/ApplicationServices.h>
// OS X say(1)命令的简单粗暴实现
// 编译时传入-framework ApplicationServices参数
void main (int argc, char **argv) {
OSErr rc;
SpeechChannel channel;
VoiceSpec vs;
int voice;
char *text = "What do you want me to say?";
if (!argv[1]) { voice = 1; } else { voice = atoi(argv[1]); }
if (argc == 3) { text = argv[2]; }
// GetIndVoice获得某个索引(正数)定义的声音
rc= GetIndVoice(voice, // SInt16 index,
&vs); // VoiceSpec * voice
// NewSpeechChannel函数使得选定的声音可用
rc = NewSpeechChannel(&vs,// VoiceSpec * voice, /* 可以为NULL */
&channel);
// 调用SpeakText函数说出文本
rc = SpeakText(channel, // SpeechChannel chan,
text, // const void * textBuf,
strlen(text)); //unsigned long textBytes
if (rc) { fprintf (stderr,"Unable to speak!\n"); exit(1);}
// 由于语音播放是异步的,所以要等待播放结束。
// Objective-C可以使用更为优雅的回调函数
while (SpeechBusy()) sleep(1);
exit(0);
}
这个语音框架也可以通过其他方法访问。有一些其他语言也有这个框架的绑定,例如Python和Ruby;对于非程序员,还可以使用命令行工具say(1)(也就是上面这个例子模仿的程序),此外还可以使用苹果优秀的脚本语言Applescript(通过osascript(1)访问)。您可以自己尝试一下,玩一玩命令行程序(这也有可能会闹笑话,或者说是有创意的用法,参见图2-3中的漫画)。
图2-3 OS X语音特性的其他有创意的用法。摘自有意思的网站 http://XKCD.com/530
(漫画中的人物所需要的命令是osascript -e“set Volume 10”)
根据前文所述,应用程序可以完全依赖于框架,事实上很多OS X和iOS应用就是这么干的。然而框架本身也依赖于操作系统提供的库,下面就要讨论库。