三、媒体层
媒体层包含图形技术、音频技术和视频技术,这些技术相互结合就可为移动设备带来最好的多媒体体验,更重要的是,它们让创建外观音效俱佳的应用程序变得更加容易。您可以使用iOS的高级框架更快速地创建高级的图形和动画,也可以通过底层框架访问必要的工具,从而以某种特定的方式完成某种任务。
图形技术
高质量的图形是iOS应用程序的重要组成部分。创建应用程序最简单最有效的方法是使用事先渲染过的图片,搭配上标准视图以及UIKit框架的控件,然后把绘制任务交给系统来执行。但是在某些情况下,您可能需要一些UIKit所不具有的功能,而且需要定制某些行为。在这种情况下,您可以使用下述技术管理应用程序的图形内容:
Core Graphics (也被称为Quartz),用于处理本地2D向量渲染和图片渲染。
Core Animation ( Quartz Core框架的一部分),为动画视图和其他内容提供更高级别支持。
OpenGL ES,为使用硬件加速接口的2D和3D渲染提供支持。
Core Text,提供一个精密的文本布局和渲染引擎。
Image I/O,提供读取及编写大多数图形格式的接口。
资产库框架(Assets Library framework),可用于访问用户照片库中的照片和视频。
大多数应用程序应该无需改动,或者只需做很少修改,便可运行在具备高分辨率屏幕的设备。因为在绘图或者操作视图的时候,您所指定的座标值会被映射到逻辑座标系统,它和底层屏幕分辨率没有关联。而且绘制的内容会自动根据需要按比例缩放,以此来支持高分辨率屏幕。对基于向量进行绘制的代码来说,系统框架会自动使用额外的像素来改善图画的内容,使其变得更清晰。如果应用程序中使用了图片,则可以利用UIKit自动加载现有图片的高分辨率版本。
音频技术
iOS音频技术可帮助您为用户提供丰富多彩的音响体验。您可以使用音频技术来播放或录制高质量的音频,也可以用于触发发设备的震动功能(具有震动功能的设备)。
iOS系统提供数种播放或录制音频的方式供您选用。在选择音频技术的时候,请记住,要尽可能地选取高级框架,因为它们可以简化播放音频所需的工作。下面列出的框架从高级到低级排列,媒体播放器框架(Media Player framwork)提供的是最高级的接口:
媒体播放器框架:该框架可以让访问用户的iTume库变得很容易,并且支持播放曲目和播放列表。
AV Foundation框架:它提供一组简单易用的Objective-C接口,可用于管理音频的播放或录制。
OpenAL框架:它提供一组跨平台,用于发布方位音频的接口。
Core Audio框架:它提供的接口简单而精密,可用于播放或录制音频内容。您可以使用这些接口播放系统的警报声音、触发备的震动功能、管理多声道的缓冲和播放、对音频内容进行流化处理。
iOS音频技术支持下述音频格式:
AAC
Apple Lossless (ALAC)
A-law
IMA/ADPCM (IMA4)
Linear PCM
µ-law
DVI/Intel IMA ADPCM
Microsoft GSM 6.10
AES3-2003
视频技术
iOS有数种技术可用于播放应用程序包的电影文件以及来自网络的数据流内容。如果设备具有合适的视频硬件,这些技术也可用于捕捉视频,并可将捕获到的视频集成到应用程序。
系统提供也提供多种方法用于播放或录制视频内容,您可以根据需要选择。选择视频技术的时候,请尽可能选择高级框架,因为高级框架可以简化为提供对某种功能的支持所需的工作。下面列出的框架由高级到低级排列。其中,媒体播放器框架提供最高级的接口:
媒体播放器框架,它提供一组易于使用的接口,可用于播放应用程序中全屏或部分屏的电影。
AV Foundation框架,它提供一组Objective-C接口,可以对电影的捕捉和播放进行管理。
Core Media框架,它对较高级框架使用的底层类型进行描述,同时也提供一些底层接口,它们用于对媒体进行处理。iOS视频技术支持播放的电影文件应具有.mov、.mp4、.m4v以及.3gp文件扩展名,而且文件应使用下述的压缩标准:
H.264视频,多达1.5 Mbps, 640x480像素,每秒30帧。 H.264 Baseline Profile 的 Low-Complexity 版本支持 AAC-LC 音频( .m4v、.mp4以及.mov文件格式中高达160Kbps ,48KHz 的立体音频)。
H.264视频,高达68 Kbps,320x240像素,每秒30帧。达到Level 1.3的 Baseline Profile支持AAC-LC音频( .m4v、.mp4以及.mov文件格式中高达160Kbps ,48KHz 的立体音频)。
MPEG-4视频,高达 2.5 Mbps, 640 x 480像素,每秒30帧。Simple Profile支持AAC-LC 音频( .m4v、.mp4以及.mov文件格式中高达160Kbps ,48KHz 的立体音频)。
各种音频格式,包括 “音频技术”列出的清单。
媒体层包含的框架
后续部分对媒体层的框架和框架所提供的服务进行说明。
资产库框架
iOS 4.0引入了资产库框架(AssetsLibrary.framework),该框架提供一个查询界面,您可以通过它查找用户照片和数据。通过使用该框架,您可以访问Photos管理的资产,包括用户保存的相册以及导入到设备中的图片或视频。而且您也可以将照片或者视频保存到用户的相册。
AV Foundation 框架
iOS 2.2引入了AV Foundation 框架 (AVFoundation.framework),该框架包含的Objective-C 类可用于播放音频内容。通过使用该框架,您可以播放声音文件或播放内存中的音频数据,也可以同时播放多个声音,并对各个声音的播放特定进行控制。在 iOS 4.0及后续版本中,该框架提供的服务得到很大的扩展,下述的服务现在也包含在框架中:
媒体资产管理
媒体编辑
电影捕捉
电影播放
曲目管理
媒体项的元数据管理
立体声淘选
不同声音的精确同步
用于判断声音文件详细信息的Objective-C接口,例如判断数据格式、采样率和声道数。
AV Foundation框架是iOS中录制播放音频和视频的唯一框架,该框架还支持对媒体项进行管理和处理。Core Audio
表3-1列出来的Core Audio框架家族为音频提供本地支持。Core Audio框架提供C语言接口,可用于操作立体声音频。通过iOS系统Core Audio框架,您可以在应用程序中生成、录制、混合或播放音频,您也可通过该框架访问设备的震动功能(支持震动功能的设备)。
表 3-1 Core Audio框架框架 服务
CoreAudio.framework 定义Core Audio框架家族使用的音频数据类型。
AudioToolbox.framework 播放或录制音频文件或数据流,也可用于管理音频文件、播放系统警告声音、触发某些设备的震动功能。
AudioUnit.framework 为内置音频单元服务,内置音频单元是指音频处理模块。
Core Graphics 框架
Core Graphics框架 (CoreGraphics.framework)包含Quartz 2D绘图API接口 。Quartz 是Mac OS X系统使用的向量绘图引擎,它支持基于路径绘图、抗锯齿渲染、渐变、图片、颜色、坐标空间转换、PDF文件的创建、显示和解析。虽然API基于C语言,但是它使用基于对象的抽象以表示基本绘图对象,这样可以让开发者可以更方便地保存并复用图像内容。
Core Text 框架
iOS 3.2引入了Core Text框架(CoreText.framework),该框架包含一组简单高效的C接口,可用于对文本进行布局以及对字体进行处理。Core Text框架提供一个完整的文本布局引擎,您可以通过它管理文本在屏幕上的摆放。所管理的文本也可以使用不同的字体和渲染属性。该框架专为诸如字处理程序这类需要具有精密文本处理功能的应用程序而设计。如果您的应用程序只需要一种文本输入和显示,则应使用UIKit框架中已有的类。
Core Video 框架
iOS 4.0引入了 Core Video框架 (CoreVideo.framework) ,该框架为Core Media提供缓存和缓存池的支持。大多数应用程序都不应该直接使用该框架。Image I/O 框架
iOS 4.0引入 Image I/O 框架 (ImageIO.framework),该框架的接口可用于导入或导出图像数据及图像元数据。该框架建构于 Core Graphics数据类型和函数之上,能够支持iOS 上所有的标准图像类型。
媒体播放器框架
媒体播放器框架 (MediaPlayer.framework)为应用程序播放视频和音频内容提供高级支持。通过该框架,您就可以使用标准系统界面播放视频。 iOS 3.0增加了对访问用户iTune库的支持。因此,您可以利用该框架播放音乐曲目、播放列表、搜索歌曲并向用户显示媒体选取界面。在 iOS 3.2系统中,该框架发生了变化,开始支持在可改变尺寸的视图中播放视频(之前只支持全屏)。另外还新增数个界面用于支持配置和管理电影播放。
OpenAL 框架
除了Core Audio之外,, iOS 还支持 Open Audio Library (OpenAL)。OpenAL接口是在应用程序中发布方位音频的跨平台标准。通过使用该框架,您可以在游戏或者要求有方位音频输出的程序中实现高性能、高质量的音频。OpenAL是跨平台的标准,iOS平台使用OpenAL编写的代码模块可以移植到许多其他的平台运行。
OpenGL ES 框架
OpenGL ES框架(OpenGLES.framework)提供的工具可用于绘制2D及3D内容。该框架基于C语言,能够和设备硬件紧密协作,为全屏游戏类型的应用程序提供很高的帧速率。
OpenGL框架需要和EAGL接口结合使用。这些接口是 OpenGL ES 框架的一部分,它们是OpenGL ES绘图代码及应用程序中的窗口对象的接口。在 iOS 3.0及其后续版本的系统中,OpenGL ES 框架同时支持 OpenGL ES 2.0 及OpenGL ES 1.1 接口规范。2.0规范支持分段和点着色,只有运行iOS 3.0及其后续版本的设备才支持2.0。所有版本的iOS及iOS设备都支持OpenGL ES 1.1规范。
Quartz Core 框架
Quartz Core框架 (QuartzCore.framework)包含Core Animation接口。Core Animation是高级动画制作和混合技术,它使用经过优化的渲染路径实现复杂的动画和视觉效果。它提供的高级Objective-C接口可对动画效果进行配置,然后在设备硬件中进行渲染,以此来提高程序的性能。Core Animation框架被整合到iOS的许多部分(包括UIKit框架中的许多类(如UIView)),可以为多种系统行为提供动画效果。您也可以使用该框架中的Objective-C接口直接创建定制动画。
四、Core Services 层
Core Services层为所有的应用程序提供基础系统服务。可能应用程序并不直接使用这些服务,但它们是系统很多部分赖以建构的基础。
高阶特性
下面的部分描述一些比较常见特性,也许您正打算让您的应用程序支持这些特性。
块对象
iOS 4.0引入了块对象。块对象是C级别的构造,您可以在C或Objective-C代码中使用快对象。从本质上说,块对象本质上是一个匿名函数加上该函数的伴随数据。有些时候,其他语言也称块对象为 closure或者lambda。块对象非常适用于回调函数。如果您需要有很便捷的方法将执行代码和相关数据组合在一起,块对象也是很好的选择。
在 iOS系统中,块对象通常用于下述场合:
作为委托或委托方法的替代品。
作为回调函数的替代品。
用于实现一次性操作的完成处理器。
简化在群体所有子项上迭代执行某种任务的操作。
配合分发队列。可用于执行异步任务。
Grand Central Dispatch
iOS 4.0引入了 Grand Central Dispatch (GCD),它是BSD级别的技术,可用于在应用程序内管理多个任务的执行。GCD技术将异步编程模型和高度优化内核结合在一起,可作为多线程的便捷(且更高效)替代。同时,它也为许多种底层任务( 例如读写文件描述符、实现定时器、监视信号和处理事件等)提供替代方案。
应用程序内购买(In App Purchase)
iOS 3.0引入了应用程序内购买功能。通过该功能,您可以在应用程序内出售内容或服务。该功能使用Store Kit框架来实现,它可以为使用iTunes账户进行的财务交易的处理提供基础支持,应用程序只需处理用户体验及待售内容或服务的展现。
定位服务
应用程序可使用Core Location框架提供的接口追踪用户位置。此框架利用当前可用的硬件无线电波(包括Wi-Fi、蜂窝无线或者GPS)定位用户的当前位置。应用程序可以对框架提供的信息进行裁剪,然后再将其发送给客户, 或是用于实现某些特定功能。举个例子,社交应用程序允许您找到附近其他应用程序用户,然后再与之进行通讯。
SQLite
SQLite库允许开发者将一个轻量级SQL数据库嵌入到应用程序,而且开发者不需要运行独立的远程数据库服务器进程。在此之后,开发者可以在应用程序中创建本地数据库文件,管理文件中的表和记录。虽然SQLite数据库出于通用目的而设计,但它还是针对数据库记录的快速访问做过优化。用于访问SQLite库的头文件位于 <iOS_SDK>/usr/include/sqlite3.h。 在该路径中, <iOS_SDK>是Xcode安装目录中目标SDK的路径。如果需要更多如何使用SQLite的信息, 请访问http://www.sqlite.org网站。
XML 支持
Foundation框架支持使用NSXMLParser 类从XML文档中解析元素,而libXML2库则为操作XML内容提供支持。 libXML2库是开源的,它可以让您快速地解析或写入任意的XML数据,也可将XML内容转化为HTML文件。用于访问libXML2库的头文件位于 <iOS_SDK>/usr/include/libxml2/。 在该路径中, <iOS_SDK>是Xcode安装目录中目标SDK的路径。如要更多libXML2的使用信息, 请访问 http://xmlsoft.org/index.htm 网站。
Core Services 框架
下述部分描述Core Services层的框架以及这些框架提供的服务。
Address Book 框架
Address Book框架 (AddressBook.framework)支持编程访问存储于用户设备中的联系人信息。如果应用程序使用到联系人信息,则可通过该框架访问并修改用户联系人数据库的记录。举个例子,通过使用该框架,聊天程序可以获取一个联系人列表,利用此列表初始化聊天会话,并在联系人视图显示列表的联系人。
CFNetwork 框架
CFNetwork框架(CFNetwork.framework)提供一组高性能基于C语言的接口,它们为使用网络协议提供面向对象抽象。通过这些抽象,您可以对协议栈进行更精细的控制,而且可以使用诸如 BSD socket这类底层结构。您也可以通过该框架简化诸如与FTP或HTTP服务器通讯以及DNS主机解析这类任务。下面列举一些可以使用 CFNetwork框架执行的任务:
使用BSD sockets
使用SSL或TLS创建加密连接
解析DNS主机
使用HTTP,校验HTTP以及HTTPS服务器。
使用FTP服务器
发布、解析并浏览 Bonjour服务。
Core Data 框架
iOS 3.0引入Core Data框架(CoreData.framework)。Core Data框架是一种管理模型-视图-控制器应用程序数据模型的技术,它适用于数据模型已经高度结构化的应用程序。通过此框架,您再也不需要通过编程定义数据结构,而是通过Xcode提供的图形工具构造一份代表数据模型的图表。在程序运行的时候,Core Data框架就会创建并管理数据模型的实例,同时还对外提供数据模型访问接口。通过Core Data管理应用程序的数据模型,可以极大程度减少需编写的代码数量。除此之外,Core Data还具有下述特征:
将对象数据存储在SQLite数据库以获得性能优化。
提供NSFetchedResultsController 类用于管理表视图的数据。
管理undo/redo操作。
属性值校验支持。
支持对数据变化进行传播,并且不会改变对象间的关联。
支持对数据进行归类,过滤,并支持对内存数据进行管理。
如果您正在开发新应用程序或打算对某个现有的程序进行大幅度更新,请考虑使用Core Data。
Core Foundation 框架
Core Foundation框架 (CoreFoundation.framework) 是一组C语言接口,它们为iOS应用程序提供基本数据管理和服务功能。下面列举该框架支持进行管理的数据以及可提供的服务:
群体数据类型 (数组、集合等)
程序包
字符串管理
日期和时间管理
原始数据块管理
偏好管理
URL及数据流操作
线程和RunLoop
端口和soket通讯
Core Foundation框架和Foundation框架紧密相关,它们为相同功能提供接口,但Foundation框架提供Objective-C接口。如果您将Foundation对象和Core Foundation类型掺杂使用,则可利用两个框架之间的 “toll-free bridging”。所谓的Toll-free bridging是说您可以在某个框架的方法或函数同时使用Core Foundatio和Foundation 框架中的某些类型。很多数据类型支持这一特性,其中包括群体和字符串数据类型。每个框架的类和类型描述都会对某个对象是否为 toll-free bridged,应和什么对象桥接进行说明。
Core Location 框架
Core Location框架 (CoreLocation.framework)可用于定位某个设备当前经纬度。它可以利用设备具备的硬件,通过附近的GPS、蜂窝基站或者WiFi信号等信息计算用户方位。Maps应用程序就是利用此功能在地图上显示用户当前位置。您可以将此技术结合到应用程序,以此向用户提供方位信息。例如,应用程序可根据用户当前位置搜索附近饭店、商店或其他设施 。在iOS 3.0系统中,该框架开始支持访问iOS设备(具有相应硬件的设备)的方向信息。在iOS 4.0系统中,该框架开始支持低能耗的方位监视服务,该服务利用蜂窝基站跟踪用户方位。
Core Media 框架
iOS 4.0引入了Core Media框架 (CoreMedia.framework)。此框架提供AV Foundation框架使用的底层媒体类型。只有少数需要对音频或视频创建及展示进行精确控制的应用程序才会涉及该框架,其他大部分应用程序应该都用不上。
Core Telephony 框架
iOS 4.0引入了Core Telephony框架(CoreTelephony.framework)。此框架为访问具有蜂窝无线的设备上的电话信息提供接口,应用程序可通过它获取用户蜂窝无线服务的提供商信息。如果应用程序对于电话呼叫感兴趣,也可以在相应事件发生时得到通知。
Event Kit 框架
iOS 4.0引入了 Event Kit框架 (EventKit.framework)。此框架为访问用户设备的日历事件提供接口。您可以通过该框架访问用户日历中现有事件,可以增加新事件。日历事件可包含闹铃,而且可以配置闹铃激活规则。
Foundation 框架
Foundation框架 (Foundation.framework)为 Core Foundation框架的许多功能提供Objective-C封装。您可以参考Core Foundation框架了解前面对Core Foundation框架的描述。 Foundation框架为下述功能提供支持:
群体数据类型 (数组、集合等)
程序包
字符串管理
日期和时间管理
原始数据块管理
偏好管理
URL及数据流操作
线程和RunLoop
Bonjour
通讯端口管理
国际化
正则表达式匹配
缓存支持
Mobile Core Services 框架
iOS 3.0引入了Mobile Core Services框架 (MobileCoreServices.framework)。此框架定义统一类型标识符 (UTIs)使用的底层类型。
Quick Look 框架
iOS 4.0引入Quick Look框架(QuickLook.framework),应用程序可以用过该框架预览无法直接支持查看的文件内容。如果应用程序从网络下载文件或者需处理来源未知的文件,则非常适合使用此框架。因为应用程序只要在获得文件后,调用框架提供的视图控制器就可以直接在界面中显示文件的内容。
Store Kit 框架
iOS 3.0引入Store Kit框架(StoreKit.framework),此框架为iOS应用程序内购买内容或服务提供支持。例如,开发者可以利用此框架允许用户解锁应用程序的额外功能。或者假设您是一名游戏开发人员,则可使用此特性向玩家出售附加游戏级别。在上述的两种情况中,Store Kit 框架会处于交易过程中和财务相关的事件,包括处理用户通过 iTunes Store账号发出的支付请求并且向应用程序提供交易相关信息。Store Kit框架主要关注交易过程中和财务相关的事务,目的是为了确保交易安全准确。应用程序需要处理交易事物的其他因素,包括购买界面和下载(或者解锁)恰当的内容。通过这种任务划分方式,您就拥有购买内容的控制权,可以决定希望展示给用户的购买界面以及何时向用户展示这些界面,同时也可以决定和应用程序最匹配的交付机制。
System Configuration 框架
System Configuration框架(SystemConfiguration.framework) 可用于确定设备的网络配置。您可以使用该框架判断Wi-Fi或者蜂窝连接是否正在使用中,也可以用于判断某个主机服务是否可以使用。
五、Core OS 层
Core OS层的底层功能是很多其他技术的构建基础。通常情况下,这些功能不会直接应用于应用程序,而是应用于其他框架。但是,在直接处理安全事务或和某个外设通讯的时候,则必须要应用到该层的框架。
Accelerate 框架
iOS 4.0引入了Accelerate框架(Accelerate.framework)。该框架的接口可用于执行数学、大数字以及DSP运算。和开发者个人编写的库相比,该框架的优点在于它根据现存的各种iOS设备的硬件配置进行过优化。因此,您只需一次编码就可确保它在所有设备高效运行。
External Accessory 框架
iOS 3.0引入了External Accessory框架(ExternalAccessory.framework),通过它来支持iOS设备与绑定附件通信。附件可以通过一个30针的基座接口和设备相连,也可通过蓝牙连接。通过External Accessory框架,您可以获得每个外设的信息并初始化一个通讯会话。通讯会话初始化完成之后,您可以使用设备支持的命令直接对其进行操作。
Security 框架
iOS系统不但提供内建的安全功能,还提供Security框架(Security.framework)用于保证应用程序所管理之数据的安全。该框架提供的接口可用于管理证书、公钥、私钥以及信任策略。它支持生成加密的安全伪随机数。同时,它也支持对证书和Keychain密钥进行保存,是用户敏感数据的安全仓库。
CommonCrypto接口另外还支持对称加密、HMAC以及Digests。实际上,Digests的功能实和OpenSSL库常用的功能兼容,但是iOS无法使用OpenSSL库。
在 iOS 3.0及其后续版本的系统中, 您可以让所创建的多个应用程序共享某些Keychain项,这样可以让相同套件内的应用程序的互用更流畅。举个例子,您可以在应用程序间共享用户密码和及其他元素。通过这种方法,您就不需要在每个应用程序单独对用户作出提示。如应用程序需要共享数据,则每个应用程序的Xcode工程必须配备恰当的资格。
System
系统层包括内核环境、驱动及操作系统底层UNIX 接口。内核以Mach为基础,它负责操作系统的各个方面,包括管理系统的虚拟内存、线程、文件系统、网络以及进程间通讯。这一层包含的驱动是系统硬件和系统框架的接口。出于安全方面的考虑,内核和驱动只允许少数系统框架和应用程序访问。应用程序可以使用iOS提供的LibSystem库访问多种操作系统底层功能。LibSystem库的接口基于C语言,可为下述功能提供支持:
线程 (POSIX 线程)
网络 (BSD sockets)
文件系统访问
标准 I/O
Bonjour和 DNS服务
区域信息
内存分配
数学计算
许多 Core OS技术的头文件位于<iOS_SDK>/usr/include/目录,<iOS_SDK>是 Xcode安装目录中目标SDK的路径。
六、从 Cocoa 迁移到 iOS
如果您是一名Cocoa开发者,则会对iOS中的许多框架感到熟悉。虽然iOS的基础技术栈在许多方面都等同于Mac OS X,但有些框架则非如此。本章针对创建iOS应用程序可能碰到的差异进行描述,同时也说明如何应对某些重要变化:
请注意:本章专为已熟悉Cocoa术语和编程技术的开发者设计。
通用的迁移注意事项
如果您的Cocoa应用程序已经使用模型-视图-控制器模式,则很容易将程序的关键部分迁移到iOS系统。
迁移数据模型
如果Cocoa应用程序的数据模型以Foundation或者Core Foundation框架的类为基础,则将数据模型迁移到iOS只需做少量修改,甚至无需修改。因为iOS也支持这两个框架。并且彼此差异不大。大多数差异要么相对次要,要么和iOS应用程序无法具有的功能相关。例如iOS应用程序所不支持AppleScript。如果Cocoa应用程序使用Core Data,则只能将其数据模型迁移到iOS3.0及后续版本,因为早期的iOS不支持Core Data。iOS的Core Data框架支持二进制和SQLite数据存储(不支持XML数据存储),同时也支持从现有的Cocoa应用程序迁移数据。如果是受支持的数据存储,您可以把Core Data资源文件复制到iOS应用程序工程,然后就可以直接使用这些文件。如果Cocoa应用程序在屏幕上显示很多数据,则在将其迁移到iOS的时候,您可能需要对数据模型进行简化。虽说iOS系统上也可创建数据量大且内容丰富的应用程序,但是这样做并不符合用户需求,因为移动用户通常希望在最短的时间里获得最重要的信息。另外,一次性提供给用户太多数据也行不通,毕竟屏幕的空间有限。而且这样做可能会让应用程序变慢,因为加载数据也需要额外的工作。如果对Cocoa的数据结构进行重构可以提供更好的性能及更优秀的iOS用户体验,那就非常值得一试。
迁移用户界面
iOS用户界面的结构及实现和Mac OS X有很大区别。以 Cocoa表示视图和窗口的对象为例。虽然iOS和Cocoa都有用于表示视图和窗口的对象,但是不同平台对象的工作方式稍有差异。另外,在iOS系统中,视图显示的内容需要更精心地挑选,因为屏幕尺寸有限,而视图又必须足够大以便给用户的手指提供足够多的操作目标。
除了视图对象自身的差异,在程序运行时,视图显示方式也有巨大差别。举个例子,如果您希望在Cocoa应用程序中显示很多数据,则可以增加窗口的尺寸,使用多个窗口或者使用标签窗口来管理数据。而在iOS应用程序中,只存在一个窗口且窗口的尺寸固定不变。因此,应用程序必须按合理尺寸对信息进行分块,并把数据块呈现在不同的视图。对信息进行分块是为了将其划分成多个屏幕内容,然后您可以根据屏幕内容设计相应的应用程序视图。举个例子,如果要在Cocoa显示分层列表数据,您可能会使用一个NSBrowser对象。但是在iOS系统中,您就需要创建一组大相径庭的视图用于显示不同层的信息。虽然这种方式会导致更复杂的界面设计,但是它的确是非常重要的显示信息的方式。因此,iOS系统为这种组织方式提供很多支持。
Mac OS X v10.5系统Cocoa才开始引入视图控制器,对于视图控制器的使用可能还未普及。但在iOS应用程序中,视图控制器是用户界面管理基础架构的关键部分。视图控制器管理用户界面的展现,而且它还与系统相互协作,可以保证应用程序的资源不会占用太多内存,因而可防止程序性能下降。总之,理解视图控制器的角色及其在应用程序的使用方式是设计用户界面的关键。
内存管理
iOS系统不支持垃圾收集,您需要使用内存管理模型保持、释放或自动释放对象。
和Macintosh计算机相比, iOS设备内存非常有限。因此,您需调整自动释放池的使用,避免创建多个自动释放池对象。另外,请尽可能直接释放对象,不要自动释放。如果您在一个紧凑的循环中分配了很多对象,要么就直接释放那些对象,要么就在循环代码中的恰当的位置创建自动释放池,并在规则的间隔内释放自动释放对象。等到循环结束再释放可能会导致内存不足的警告或导致应用程序被系统杀死。
框架差异
虽然iOS的大多数框架同样存在于 Mac OS X系统,但不同平台框架具有不同的实现方式和使用方式。下面收集了一些Mac OS X 开发者开发iOS应用程序需要注意的重要差别:
UIKit 与 AppKit 的对比
在 iOS系统中,创建图形应用程序、管理事件循环以及执行其他界面相关的任务都离不开UIKit提供的基础结构。UIKit和AppKit具有非常显著的区别,在设计iOS应用程序的时候,应该特别注意这一点。也正是因为这个原因,在将Cocoa应用程序迁移到iOS系统的时候,您必须提供和界面相关的类和逻辑。表6-1列出了框架之间的特定的差异,它可帮助您理解iOS中的应用程序应该具有什么特征:
表 6-1 界面技术的差异差异 讨论
文档支持 在iOS系统中,文档角色的重要性有所降低,简单内容模型则变的越来越重要。因为iOS系统的应用程序通常只拥有一个窗口(在不连接外部显示的情况下),主窗口是创建及编辑所有应用程序内容的唯一环境。更重要的是,所有和文档相关的操作,包括文件的创建和管理,现在都由应用程序在幕后完成,不再需要用户干预。
视图类 UIKit为您提供一组非常有针对性的视图和控件。AppKit框架有许多视图和控件无法在iOS设备上工作,其他一些视图则被更具iOS特色的视图替代。例如,在显示分层信息的时候,iOS不使用 NSBrowser类,而是使用完全不同的样式(导航控制器)。。
视图座标系统 iOS系统Quartz和UIKit内容的绘画模型和Mac OS X的基本相同,只有一处例外。在 Mac OS X绘画模型坐标系统中,窗口和视图的原点默认位于左下角,坐标轴向上向右延伸。但在iOS系统中,默认的原点位置是左上角,坐标轴向下向右延伸。Mac OS X的座标系统称为“被翻转”的座标系统,iOS则是缺省座标系统。
窗口即视图 从概念上来看,iOS系统的窗口和视图Mac OS X的具有相同含义。但从实现的角度来看,区别很大。在Mac OS X系统中,NSWindow类是NSResponder类的子类,但在iOS系统中,UIWindow实际是UIView的子类。继承关系上的改变表明窗口将会使用Core Animation层来绘制外表。之所以有这样的改变,主要是为了在操作系统级别支持窗口分层。举个例子,系统可以在一个独立的窗口中显示状态栏,并让该窗口浮动于应用程序窗口之上。iOS系统和Mac OS X系统另外一个差异和窗口的使用方式相关。Mac OS X应用程序可以用于任意数量的窗口,但大多数iOS应用程序只能有一个窗口。在iOS应用程序中显示不同屏幕的数据不是通过改变窗口实现,而是通过在应用程序窗口中切换定制视图来完成。
事件处理 UIKit的事件处理模型和Mac OS X的事件处理模型区别很大。UIKit框架不向视图发送鼠标和键盘事件,而是发送触摸和移动事件。这些事件不但要求您实现一组不同的方法,同时也要求您修改整个事件处理代码。举个例子,本地跟踪循环的排队事件不能包含触摸事件,您的代码也据此做相应调整。
目标-动作模型 UIKit支持三种形式的动作,AppKit仅支持一种。UIKit的控件可以在不同的交互阶段调用唤醒不同动作,而且一个交互过程可以指定多个目标。因此,在UIKit中,一个控件可以在一次交互过程中向多个目标发送多个不同的动作。
绘画及打印支持 为支持UIKit渲染需要,UIKit的绘画能力经过适当的调节。它支持图片的加载和显示、字符串显示、颜色管理、字体管理以及多个用于渲染矩阵和获取图形上下文的函数。UIKit不包含通用目的的绘图类,因为iOS系统使用其他方式完成此类功能(即Quartz和OpenGL ES)。
iOS系统部支持打印功能,iOS设备不能连接打印机或其他相关的打印硬件。
文本支持 撰写电子邮件和记事本是iOS系统提供的主要的文本支持。UIKit类可以让应用程序显示并编辑简单的字符串和稍微复杂点的HMTL内容。在iOS 3.2及后续系统中,Core Text框架 和UIKit框架提供更加精密的文本处理能力,您可以通过这它们实现更精密的文本编辑及展现视图,也可通过它们定制视图提供的输入方法。
存取方法的使用和属性对比 UIKit在其类声明中大量使用属性。属性由Mac OS X在10.5版本引入,是AppKit框架大量的类创建出来以后才出现。属性不是对AppKit框架getter和setter方法的简单模仿,而是被UIKit用于简化类接口。
控件和单元 UIKit控件不使用单元。单元被Mac OS X作为视图的轻量级替代物。但是UIKit视图本身就是非常轻量的对象,因此单元派不上用场。虽然在命名约定上,UITableView类也用到了单元这个词,但是此处的单元实际上是UITableView的子类。
表视图 iOS系统的 UITableView 类可以看成是AppKit框架中NSTableView和NSOutlineView的折中物。它结合Appkit框架中者两个类的特征,更适合在小屏幕上显示。 UITableView一次显示一列数据,而且您将相关的行组合成一个区段。UITableView也可用于显示并编辑分层列表数据。
菜单 几乎所有iOS应用程序的命令集都比类似的Mac OS X应用程序小得多,因此,iOS不支持菜单,通常也用不到菜单。对于需要少数的命令的场合,使用工具栏或者一组按键更加合适。对于需要数据菜单的场合,使用拾取器或导航控制器界面通常更合适,而如需对上下文敏感的菜单,则可其中的菜单项显示在Edit菜单,用它们替代或补充剪切、复制或者粘贴等命令。
Core Animation 层 在 iOS系统中,所有外表的绘制都由Core Animation层实现。该框架还隐式为许多视图相关属性提供的动画支持。由于这种内建的动画支持,您就不需要在代码中显示使用Core Animation层,只需更改一下视图的某些属性即可实现大多数动画。只有当需要对分层进行精确控制或者不想将某些特征暴露于视图层,您才需要直接使用Core Animation。
Foundation 框架的差异
Mac OS X和 iOS都有Foundation框架,大多数您所预期的类都可以在该框架中找到。 两个平台的框架都支持数值管理、字符串、集合、线程以及许多其他常见的数据类型。表6-2列出一些不包含于iOS框架的重要功能以及相关类不存在的缘由,同时也尽量列出有哪些技术可作为替代。
表 6-2 iOS的Foundation不具有的技术技术 注意事项
元数据和预测管理 iOS不支持Spotlight 元数据和搜索预测,因为iOS不支持Spotlight。
分布式对象和端口名称服务管理 iOS不存在分布式对象技术,但是您可以使用NSPort家族类和端口(及socket)进行交互交互。您也可以使用Core Foundation和CFNetwork框架处理网络需求。
Cocoa绑定 iOS不支持Cocoa绑定,而是使用经过少量修改的目标-动作模型。因为这种方式可以让代码对动作的处理方式有更多的灵活性。
Objective-C垃圾收集 iOS不支持垃圾收集,您必须使用内存管理模型。您需要通过保持对象来宣告对对象的拥有权,并在不需要对象的时候释放对象。
AppleScript支持 iOS不支持AppleScript。
iOS系统的Foundation框架提供对XML的支持,您可以通过 NSXMLParser 类解析XML文件,其他解析类(包括NSXMLDocument、NSXMLNode)不受支持。除了NSXMLParser之外,您还可以使用libXML2库,这是C语言的XML解析接口。
其他框架的改变
表 6-3列出iOS其他框架的关键差异。
表 6-3 同时存在于iOS和Mac OS X的框架之间的差异框架 差异
AddressBook.framework 该框架接口可用于访问用户的联系人信息。虽然名称相同,但是此框架的iOS版本和Mac OS X版本却有很大的区别。在iOS系统中,除了访问联系人数据的C接口,您还可以使用Address Book UI框架提供的类展现标准联系人挑选和编辑界面。
如需进一步的信息。
AudioToolbox.framework
AudioUnit.framework
CoreAudio.framework 在iOS系统中,这些框架支持音频录制、播放以及单声道和多声道的音频内容混合,但不支持更高级的音频处理功能和定制音频单元插件。不过iOS系统增加了一个功能,即触发iOS设备(具有相应硬件)的震动功能。
CFNetwork.framework 该框架包含Core Foundation Network接口。在iOS系统中,CFNetwork框架是顶层框架,它没有子框架。该框架的接口大部分保持不变。
CoreGraphics.framework 该框架包含Quartz接口。在iOS系统中,Core Graphics框架是顶层框架,它没有子框架。使用Quartz创建路径、渐变、阴影、图案、图像以及位图的方式和Mac OS X系统完全相同。不过有一些Quartz的功能(包括PostScript支持、图像来源和去向、Quartz显示服务支持、Quartz事件服务支持)不存在于iOS系统。
OpenGLES.framework OpenGL ES 是专为嵌入式系统设计的OpenGL版本。如果您是OpenGL开发人员,则应该会很熟悉OpenGL ES接口。不过,OpenGL ES接口还是有几点较大差别。首先,它是一套更加小巧的接口,仅支持可以在现有图形硬件有效执行的功能。第二,许多桌面OpenGL可以使用的扩展并不存在于OpenGL ES。虽然如此,您应该还是能够执行大多数和桌面OpenGL相同的操作。但如果你是在迁移现有的OpenGL代码,则可能需要重写一部分代码,需要使用iOS系统的渲染技术(不同于Mac OS X)。
QuartzCore.framework 该框架包含Core Animation接口。iOS大部分 Core Animation接口和Mac OS X相同。但是iOS系统没有用于管理布局约束的类,也不支持使用Core Image过滤器。另外,iOS也没有Core Image和Core Video接口(两者都包含于Mac OS X版本的QuartzCore框架)。
Security.framework 该框架包含安全接口。在iOS系统中,该框架通过加解密、伪随机数生成以及Keychain保护应用程序数据安全。该框架不包含身份验证或身份验证接口,也不支持显示证书内容。Keychain接口也是Mac OS X版本的简化。
SystemConfiguration.framework 该框架包含和网络相关的接口。在iOS系统中,您可以使用这些接口来决定设备如何与网络连接,是通过EDGE、GPRS或是通过Wi-Fi。
七、iOS 的框架
本附录介绍iOS系统包含的框架,它们为编写iOS平台的软件提供必要的接口。下面的表格尽可能地列出框架中的类、方法、函数、类型以及常量使用的关键前缀,请避免在您的符号名称中使用这些前缀。
设备中的框架
表B-1描述iOS设备提供的框架,它们位于<Xcode>/Platforms/iPhoneOS.platform/Developer/SDKs/<iOS_SDK>/System/Library/Frameworks目录。路径中的<Xcode>表示Xcode的安装目录, <iOS_SDK>则表示目标SDK版本。表中标题为“最先引入”的那一列表示首次引入相关框架的的iOS系统版本。