iOS技术概述
iPhone SDK 包含哪些东西?
苹果公司将大部分系统接口发布在框架这种特殊的数据包。一个框架就是一个目录,它包含一个动态共享库以及使用这个库所需的资源(例如头文件、图像以及帮助应用程序等)。如果要使用某个框架,则需要将其链接到应用程序工程,这一点和使用其他共享库相似。另外,您还需要告知开发工具何处可以找到框架头文件以及其他资源
除了使用框架,苹果公司还通过标准共享库的形式来发布某些技术。 由于iOS以UNIX为基础,操作系统底层的许多技术都源自开源技术,这些技术的许多接口可以从标准库和接口目录访问。
Cocoa Touch 层
Cocoa Touch层包含创建 iOS应用程序所需的关键框架。上至实现应用程序可视界面,下至与高级系统服务交互,都需要该层技术提供底层基础。在开发应用程序的时候,请尽可能不要使用更底层的框架,尽可能使用该层的框架。
多任务
尽管应用程序进入后台就会被挂起,但可以通过下述的技术让其在后台继续运行:
-
应用程序可以请求一定的时间完成某些重要的任务。
-
应用程序可以声明自身支持的某种服务需要获得定期后台执行时间。
-
应用程序可以使用本地通告在指定时间向用户发通知。这种方式对于应用程序是否运行没有要求。
不管应用程序是被挂起还是在后台运行,支持多任务不需要付出额外的工作。但是在某些情况(例如内存不足)下,应用程序可能会被结束运行。因此,应用程序应该可以在任何时候退出。这就意味着许多在退出应用程序时需要执行的任务必须改为在应用程序切换到后台的时候执行。这就要求您在应用程序委托中实现一些新的方法以响应程序的状态切换。
数据保护
和敏感用户数据打交道的应用程序可以使用设备内建加密功能(有些设备可能不提供内建加密功能)对数据进行保护。如果应用程序指定某个文件受保护,系统会以加密格式将该文件保存在磁盘。当设备锁住的时候,您的应用程序以及其他潜在的闯入者都不能访问该文件,而当用户解锁设备后,系统会生成一份密钥以便您的应用程序就访问该文件。
如需实现数据保护,应用程序应在待保护数据的创建和管理方式下一些功夫。它必须能够在数据创建之时保证其安全,而且需要适配设备上锁或未上锁造成的文件可访问性的变化。
苹果推送通知服务
从设计角度看,让应用程序支持推送通知包含两个部分。首先,iOS应用程序需要请求系统向其发送通知,然后要合理配置应用程序委托使其可以对通知进行恰当处理。这些工作可以通过应用程序委托以及UIApplication
对象合作完成。第二,您需要提供一个服务器端进程用于产生最初的通知。该进程运行在您自己的本地服务器,它和苹果推送通知服务协同工作以产生最初的通知。
本地通知
iOS 4.0引入了本地通知。本地通知是对已有推送通知的补充,通用程序可以通过它在本地生成通知,不再需要依赖外部服务器。当有重要的事件发生时,后台应用程序可以利用本地通知获得用户关注。举个例子,运行于后台的导航应用程序可以使用本地通知提醒用户要转弯。应用程序也可以安排在未来的某个时刻向用户发送本地通知,而且发送这些通知并不要求应用程序处于运行状态。
本地通知的优点是它独立于您的应用程序。一旦某个通知被安排好后,系统会负责通知发送。而且在发送通知的时候,您的应用程序无需处于运行状态
手势识别器
iOS 3.2引入了手势识别器。手势识别器是一个绑定到视图的对象,用于检测常见的手势类型。将手势识别器绑定到视图后,您可以告诉它某个手势发生的时候执行何种动作。之后,手势识别器就可以对原始事件进行跟踪,根据系统定义的试探方式识别手势。在引入手势识别器前,如果要识别一个手势,您需要跟踪视图的原始触摸事件流,然后再使用复杂的试探方法来判断这些事件是否表示某种手势。
现在,UIKit框架中包含一个UIGestureRecognizer
类,它定义了所有手势识别器的基本行为。您可以使用自定义的手势识别器子类或者系统定义的某个子类处理下面这些标准手势:
-
拍击 (任意次数的拍击)
-
向里或向外捏 (用于缩放)
-
摇动或者拖拽
-
擦碰 (以任意方向)
-
旋转 (手指朝相反方向移动)
-
长按
如需进一步了解您可以使用的手势识别器
文件共享支持
应用程序可以使用文件共享让用户访问程序的用户数据文件。文件共享允许应用程序通过iTunes向用户显露应用程序/Documents
目录的内容。这样,用户就可以在iPad和桌面计算机来回移动文件。但是,该功能不允许应用程序和同一设备上的其他应用程序共享文件。如果希望在程序间共享文件,请使用剪贴板或者文档交互控制器对象。
您可以通过如下步骤来让应用程序支持文件共享:
-
在应用程序的
Info.plist
文件中添加UIFileSharingEnabled
键,并将键值设置为YES
。 -
将您希望共享的文件放在应用程序的
Documents
目录。 -
一旦设备插入到用户计算机,iTunes 9.1就会在选中设备的Apps标签中显示一个File Sharing区域。
-
此后,用户就可以向该目录添加文件或者将文件移动到桌面计算机中。
如果应用程序支持文件共享,当文件添加到Documents
目录后,应用程序应该能够识别并做出适当响应。例如说,应用程序可以将新文件的内容显示界面上。请不要向用户展现目录的文件列表并询问他们希望对文件执行什么操作。
点对点服务
在iOS 3.0 及后续版本,Game Kit框架支持经由蓝牙进行点对点连接。您可以使用点对点连接启动与某个邻近设备的通讯会话,也可用它实现多种多玩家游戏的常见特性。虽然点对点连接主要应用于游戏,但您也可将之应用于其他类型应用程序。
标准系统视图控制器
Cocoa Touch层许多框架含有展现标准系统界面的视图控制器。我们提倡您在应用程序中使用这些视图控制器,这样可以让您的程序和系统具有一致的用户体验。如果您需要执行下述任务,请从相应的框架中选择一个视图控制器使用:
-
显示或者编辑联系人信息 - 请使用Address Book UI框架中的视图控制器。
-
创建或者编辑日历事件 - 请使用Event Kit UI框架的视图控制器。
-
创建email或者SMS消息 - 请使用Message UI框架中的视图控制器。
-
打开或者预览一份文件的内容 - 请使用UIKit框架中的
UIDocumentInteractionController
类。 -
从用户的照片库选取一张照片 - 请使用UIKit框架中的
UIImagePickerController
类。 -
拍摄视频片段 - 请使用UIKit框架中的
UIImagePickerController
类。
如需了解如何选择使用视图控制器,请查看iOS视图控制器编程指南。如需了解特定视图控制器所展现的界面,请查看相应的框架参考。
外部设备支持
安装iOS 3.2的设备可通过一组设备支持的线缆连接一个外部显示设备。当外部设备连上后,应用程序就可以使用其显示屏显示内容。屏幕的信息,包括屏幕能够支持的分辨率都可通过UIKit框架的接口获取。您也可以通过该框架将应用程序窗口关联到某个屏幕。
-
UIScreen
类用于获取当前所有屏幕(包括设备主屏幕)的屏幕对象。屏幕对象包含屏幕的属性信息(包括将屏幕的尺寸和像素比例也考虑在内的屏幕特征)。 -
您可以从
UIScreenMode
类获得某个具有特定尺寸像素比例的屏幕的信息。 -
您可以将窗口(使用
UIWindow
类来表示)指定到某个特定的屏幕。如果您需要对内容作镜像显示,则需要提供两个独立的窗口,然后再在其中显示相同内容。
如需进一步了解上述类可提供的支持,请查看UIKit框架参考中相应的类描述。
Cocoa Touch 层包含的框架
Address Book UI 框架
Event Kit UI 框架
Game Kit 框架
iAd 框架
Map Kit 框架
iOS 3.0导入了 Map Kit框架 (MapKit.framework
) ,该框架供一个可被嵌入到应用程序的地图界面,该界面包含一个可以滚动的地图视图。您可以在视图中添加定制信息,并可将其嵌入到应用程序视图,通过编程的方式设置地图的各种属性(包括当前地图显示的区域以及用户的方位)。您也可以使用定制标注或标准标注(例如使用测针标记)突出显示地图中的某些区域或额外的信息。
在iOS 4.0系统中,该框架开始支持可拖动标注以及定制覆盖层。可拖动标注允许您通过编程方式或通过用户交互方式重定位某个标注的位置。覆盖层可用于创建多个点组成的复杂地图标注。地图表面诸如公交路线、选举地图、公园边界或者气象信息(例如雷达数据)等可以使用覆盖层进行显示。
如需进一步了解Map Kit框架中的类,请查看Map Kit 框架参考。
Message UI 框架
UIKit 框架
媒体层
图形技术
创建应用程序最简单最有效的方法是使用事先渲染过的图片,搭配上标准视图以及UIKit框架的控件,然后把绘制任务交给系统来执行。但是在某些情况下,您可能需要一些UIKit所不具有的功能,而且需要定制某些行为。在这种情况下,您可以使用下述技术管理应用程序的图形内容:
-
Core Graphics (也被称为Quartz),用于处理本地2D向量渲染和图片渲染。
-
Core Animation ( Quartz Core框架的一部分),为动画视图和其他内容提供更高级别支持。
-
OpenGL ES,为使用硬件加速接口的2D和3D渲染提供支持。
-
Core Text,提供一个精密的文本布局和渲染引擎。
-
Image I/O,提供读取及编写大多数图形格式的接口。
-
资产库框架(Assets Library framework),可用于访问用户照片库中的照片和视频。
大多数应用程序应该无需改动,或者只需做很少修改,便可运行在具备高分辨率屏幕的设备。因为在绘图或者操作视图的时候,您所指定的座标值会被映射到逻辑座标系统,它和底层屏幕分辨率没有关联。而且绘制的内容会自动根据需要按比例缩放,以此来支持高分辨率屏幕。对基于向量进行绘制的代码来说,系统框架会自动使用额外的像素来改善图画的内容,使其变得更清晰。如果应用程序中使用了图片,则可以利用UIKit自动加载现有图片的高分辨率版本。
音频技术
请记住,要尽可能地选取高级框架,因为它们可以简化播放音频所需的工作。下面列出的框架从高级到低级排列,,媒体播放器框架(Media Player framwork)提供的是最高级的接口:
-
媒体播放器框架。该框架可以让访问用户的iTume库变得很容易,并且支持播放曲目和播放列表。
-
AV Foundation框架。它提供一组简单易用的Objective-C接口,可用于管理音频的播放或录制。.
-
OpenAL框架。它提供一组跨平台,用于发布方位音频的接口。
-
Core Audio框架。它提供的接口简单而精密,可用于播放或录制音频内容。您可以使用这些接口播放系统的警报声音、触发备的震动功能、管理多声道的缓冲和播放、对音频内容进行流化处理。
视频技术
选择视频技术的时候,请尽可能选择高级框架,因为高级框架可以简化为提供对某种功能的支持所需的工作。下面列出的框架由高级到低级排列。其中,媒体播放器框架提供最高级的接口:
-
媒体播放器框架,它提供一组易于使用的接口,可用于播放应用程序中全屏或部分屏的电影。
-
AV Foundation框架,它提供一组Objective-C接口,可以对电影的捕捉和播放进行管理。
-
Core Media框架,它对较高级框架使用的底层类型进行描述,同时也提供一些底层接口,它们用于对媒体进行处理。
Core Services 层
Core Services层为所有的应用程序提供基础系统服务。可能应用程序并不直接使用这些服务,但它们是系统很多部分赖以建构的基础。
下面的部分描述一些比较常见特性,也许您正打算让您的应用程序支持这些特性。
块对象
Grand Central Dispatch
应用程序内购买(In App Purchase)
定位服务
SQLite
XML 支持
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,应和什么对象桥接进行说明。
Foundation 框架
Foundation框架 (Foundation.framework
)为 Core Foundation框架的许多功能提供Objective-C封装。您可以参考Core Foundation框架了解前面对Core Foundation框架的描述。 Foundation框架为下述功能提供支持:
-
群体数据类型 (数组、集合等)
-
程序包
-
字符串管理
-
日期和时间管理
-
原始数据块管理
-
偏好管理
-
URL及数据流操作
-
线程和RunLoop
-
Bonjour
-
通讯端口管理
-
国际化
-
正则表达式匹配
-
缓存支持
Core OS 层
Accelerate 框架
External Accessory 框架
Security 框架
System
iOS 的框架
设备中的框架
表B-1描述iOS设备提供的框架,它们位于<Xcode>/Platforms/iPhoneOS.platform/Developer/SDKs/
<iOS_SDK>/System/Library/Frameworks
目录。路径中的<Xcode>表示Xcode的安装目录, <iOS_SDK>则表示目标SDK版本。
模拟器的框架
设备和模拟器的框架稍有区别。模拟器将几个Mac OS X框架作为其自身实现的一部分。另外,由于系统的限制,设备框架的确切接口有可能和模拟器框架稍有不同。
系统库
请注意,iOS系统可能没有将Core OS和Core Services层某些特殊的库打包成框架,而是将其作为动态库放在系统的/usr/lib
目录。动态共享库通过.dylib
扩展名标识,其相应的头文件位于/usr/include
目录。
所有版本的iPhone SDK都包含一份安装在系统的动态共享库本地副本。这些副本被安装在您的开发系统,您可以从XCode工程进行链接。如果您需要查看某个版本的动态库列表,请查看<Xcode>/Platforms/iPhoneOS.platform/Developer/SDKs/
<iOS_SDK>/usr/lib
。在这个路径中,<Xcode>表示Xcode的安装目录,<iOS_SDK>表示您当时正在使用某个版本的SDK。
iOS使用符号链接来指向程序库的最近版本。在链接某个动态共享库的时候,请使用符号链接而不要使用动态库特定版本链接。因为在将来的iOS版本中,库的版本可能会发生改变。如果您的软件连接到某个特定的版本,而那个版本可能已经不存在于用户的系统当中,那就会出问题。