[TOC]
前言
iOS系统基于Unix系统(Darwin)
,后来Apple公司为了满足移动设备的需求,加入了自己研发的应用层、媒体层、服务层
。由此形成了一个独立的iOS系统。
Darwin本身就是一个完整的UNIX/BSD系统,具有UNIX体系惯有的高度可靠性和健壮性。
Darwin项目的创始公司是苹果公司,但Darwin完全是基于开源项目FreeBSD 5.0和Mach 3.0构建。
在iOS开发过程中,对iOS系统整体架构和核心框架的了解和学习是必不可少的一个环节。这样有助于我们开发者形成对iOS系统有一个相对系统健全的认识。 首先,我们先要了解【Cocoa Touch】框架:
我们通常称呼iOS的框架为Cocoa Touch框架,
Cocoa Touch是一个框架的集合
,里面包含了众多的子框架。
- 每一个子框架都是一个目录,包含了共享资源库,用于访问该资源库中储存的代码的头文件,以及图像、声音文件等其他资源,共享资源库定义应用程序可以调用的函数和方法。
- 框架中的类相互依赖构成一个整体,提供完善的某一方面的服务或解决方案,多个框架一起实现整个应用程序的结构。 由于应用程序的结构是通用的,开发者通过框架提供的函数和方法,做细致个性化的处理,从而满足不同应用的不同需求。
开发一个应用程序就是将需求细致化的代码插入到框架提供的设计中来组合成一个整体完成最终的应用设计。
一、系统架构
iOS提供的许多可使用的框架,构成了iOS操作系统的层次结构,从上到下依次是:
- Cocoa (Application) Layer(触摸层)
UIKit
- Media Layer (媒体层)
- Core Services Layer(核心服务层)
- Core OS Layer (核心系统操作层)
在四层之后就是硬件的内核和驱动层了
- The Kernel and Device Drivers layer(内核和驱动层)
注意:Cocoa (Application) Layer(触摸层)其实包含cocoa Touch layer(触摸层) 和Application Layer (应用层)。 应用层原本在触摸层上面,因为应用层是开发者自己实现,所以和触摸层合在一起.
每个层级提供不同的服务:
- 低层级结构提供基础服务如文件系统、内存管理、I/O操作等。
- 高层级结构建立在低层级结构之上提供具体服务如UI控件、文件访问。
其实每一层都包含多个子框架, 如下图:
批注:
-
触摸层【Cocoa Touch Layer】: 触摸层为应用程序的开发提供了常用应用基础关键技术支持的框架,其中大部分框架都与应用的外观有关界面,本质上,它负责用户在iOS设备上的触摸操作。如:
- NotificationCenter的本地通知和远程推送服务
- iAd广告框架
- GameKit游戏工具框架
- 消息UI框架,图片UI框架
- 地图框架
- 连接手表框架
- UIKit框架
- MapKit
- 自动适配等等
-
媒体层【Media Layer】: 媒体层提供图形、音频和视频等应用中视听方面的技术。如:
- 图形图像相关的CoreGraphics,CoreImage,GLKit,OpenGL ES,CoreText,ImageIO、CoreAnimation等
- 声音技术相关的CoreAudio,OpenAL,AVFoundation
- 视频相关的CoreMedia,Media Player框架
- 音视频传输的AirPlay框架等等
-
核心服务层【Core Services Layer】: 核心服务层提供给应用所需要的基础的系统服务。(这些服务中的最核心的是CoreFoundation和Foundation框架,定义了所有应用使用的数据类型。根据官网介绍,我们可以知道:Core Foundation是一个带有一组编程接口的库,这些接口从概念上派生自基于objective -C的Foundation框架,但用C语言实现。
Foundation是对CoreFoundation的OC封装)如:- Foundation
- Accounts账户框架
- CFNetwork网络连接框架
- Ad Support广告框架
- Core Foundation
- CoreData数据存储框架
- CoreMotion加速计与陀螺仪运动框架
- CoreTelephony
- SystemConfiguration
- CoreLocation地理位置框架等
-
核心操作系统层【Core OS Layer】: 系统核心层包含大多数底层级别接近硬件的功能,它所包含的框架常常被其它框架所使用。
- Accelerate框架包含数字信号,线性代数,图像处理的接口。针对所有的iOS设备硬件之间的差异做优化,保证写一次代码在所有iOS设备上高效运行。
- CoreBluetooth框架利用蓝牙和外设交互,包括扫描连接蓝牙设备,保存连接状态,断开连接,获取外设的数据或者给外设传输数据等等。
- Security框架提供管理证书,公钥和私钥信任策略,keychain,hash认证数字签名等等与安全相关的解决方案
在 官方介绍中描述:
The Cocoa (Application) layer includes technologies for building an app’s user interface, for responding to user events, and for managing app behavior
该层(Cocoa层)是为创建App提供了用户界面基础,响应用户事件,并且可以管理App的行为。这其实就是Cocoa Touch Layer(触摸层,UIKit)的作用,只是官网省略了Application Layer(应用层),因为这一层主要就是app了,主要由开发人员完成。
综上所述,在上面所有的框架中,最重要也最经常使用的就是 Cocoa层的 UIKit框架 和 CoreServices层的Foundation框架
二、Cocoa框架
Cocoa框架是iOS应用程序的基础,是OS X和 iOS操作系统的程序的运行环境
Cocoa程序由一些对象组成,而这些对象的类按继承树看,最后都是继承于它们的根类-NSObject。而且这些对象都是基于Objective-C语言下开发的运行环境。
是什么因素使一个iOS程序成为Cocoa程序呢?
不是编程语言
,因为在Cocoa开发中我们可以使用(Objective-C、Swift、Cpp、C、JS等)各种编程语言;- 也
不是开发工具
,我们可以在命令行上就可以创建 Cocoa程序。
Cocoa众多框架中最重要、最基本的两个框架是:Foundation和UIKit,两个框架的位置如下图:
Foundation框架: 和界面无关,它定义了所有应用使用的数据类型。
UIKit框架: 和界面息息相关,它为创建App提供了用户界面基础,响应用户事件,并且可以管理App的行为。
三、Cocoa框架的类继承体系
1.Foundation框架类继承体系
Foundation框架为所有应用程序提供基本的系统服务。
- 应用程序中的UIKit框架和其他框架,都是建立在Foundation框架的基础结构之上。
- Foundation框架提供许多基本的对象类和数据类型,使其成为应用程序开发的基础。
- Foundation框架还制定了一些约定(如用于取消分配等任务)使代码更加一致,可复用性更好。
我们可以借助三个图来进一步了解Foundation框架,包括了Foundation所有的类,图中灰色的是iOS不支持的,灰色部分是OS X系统的:
由上图可知,绝大部分Foundation框架的类都继承NSObject,小部分继承NSProxy
将上图Foundation框架中的类进行逻辑分类如下:
- 值对象
- 集合
- 操作系统服务 包括下面三个:
- 文件系统和URL
- 进程间通讯: 这个范畴中的大部分类代表不同的系统端口、套接字、和名字服务器,对实现底层的IPC很有用。NSPipe代表一个BSD管道,即一种进程间的单向通讯通道。
- 线程和子任务:
- NSThread类使我们可以创建多线程的程序
- 而各种锁(lock)类则为彼此竞争的线程在访问进程资源时提供各种控制机制。
- 通过NSTask,我们的程序可以分出一个子进程来执行其它工作或进行进度监控。
- 通知
- 归档和序列化
- 表达式和条件判断
- Objective-C语言服务
对于Foundation框架中的一些基本类的使用方法可以了解一下这篇文章
2.UIKit框架类继承体系
UIKit框架提供的类,用于创建基于触摸的用户界面(UI)。所有iOS应用程序都是基于UIKit,没有这个框架,就无法交付应用程序。
- UIKit框架提供应用程序对象,用于管理应用程序的基础架构。
- UIKit框架用于在
屏幕上绘图
、处理事件
,以及创建通用用户界面及其中元素
。 - UIKit框架还通过
管理屏幕上显示的窗口
、视图内容和控制触摸屏等事件
,来组织应用程序。 框架的入口#import <UIKit/UIKit.h>
当我们引入此头文件后,便可以在程序里使用任何在UIKit里声明的类。
UIKit框架是用在iOS平台上与之对应的是MAC OS X上的Application Kit,二者是姐妹框架,作用和目的相近。
我们同样可以借助一个图来进一步了解UIKit框架:
由上图可知,UIResponder类是图中最大分支的根类。
UIResponder为处理响应事件和响应链,定义了界面和默认行为
。
- 当用户用手指滚动列表或者在虚拟键盘上输入时,UIKit就生成时间传送给UIResponder响应链,直到链中有对象处理这个事件。
- 相应的核心对象,比如:UIApplication,UIWindow,UIView都直接或间接的从UIResponder继承。
应用程序可以通过三种方式使用UIKit创建界面
- 在用户界面工具(interface Buidler)从对象库里 拖拽窗口,视图或者其他的对象使用。
- 用代码创建
- 通过继承UIView类或间接继承UIView类实现自定义用户界面
对于UIKit框架中的一些基本类的使用方法可以了解一下这篇文章
四、Cocoa对象
1.Objective-C是面向对象的语言
- Objective-C和Java、C++一样,有封装,继承,多态,重用。
- 但是它不像C++那样有重载操作法、模版和多继承
- 也没有Java的垃圾回收机制
2.Objective-C的优点
Objective-C语言有C++ Java等面向对象的特点。同时Objective-C的优点是它是动态语言的。动态能力有三种:
- 动态类—运行时确定类的对象
- 动态绑定—运行时确定要调用的方法
- 动态加载—运行时为程序加载新的模块
3.动态能力相关的isa指针
每个Objective-C对象都有一个隐藏的数据结构,这个数据结构是Objective-C对象的第一个成员变量,它就是isa指针。
- isa指针指向一个类对象(class object。class object是占用内存空间的一个变量,这个对象在编译的时候编译器就生成了,专门来描述某个类的定义。)
- 这个类对象包含了Objective-C 对象的一些信息(为了区分两个对象,把前面提到的对象叫Objective-C对象),包括Objective-C对象的方法调度表,实现了什么协议等。
- 这些包含信息就是Objective-C动态能力的根源了。
- Objective-C对象在编译器,
只要满足无语法错误就可以编译通过
。在运行期才真正确定某对象指针下的对象的具体类
,从而通过具体类的isa指针动态找到方法调度表里面的方法(每个类的具体方法实现都有一个IMP指针)实现、协议等,去实现功能。
如果抛开NSObject对象的其他的成员数据和变量,NSObject可以看成这样:
@interface NSObject <NSObject> {
Class isa;
}
不考虑@interface关键字在编译时的作用,可以把NSObject更接近C语言结构表示为:
struct NSObject{
Class isa;
}
Class是用typedef 定义的: typedef struct objc_class *Class; ,那NSObject可以这么写了
struct NSObject{
objc_class *isa
}
那objc_class的结构是什么样的呢?大概是这样的:
struct objc_class {
Class isa;
Class super_class;
const char *name;
long version;
long info;
long instance_size;
struct objc_ivar_list *ivars;
struct objc_method_list **methodLists;
struct objc_cache *cache;
struct objc_protocol_list *protocols;
}
这里会看到,在这个结构体里还有一个isa指针,这里的isa指针指向的是元类对象(metaclass object)。
元类对象是用来存储的关于类的版本,名字,类方法等信息。
所有的元类对象(metaclass object)都指向 NSObject的元类对象,到头还是NSObject。一共三次:类对象->元类对象->NSObject元类对象。
为了得到整个类组织架构的信息,objc_class结构里定义了第二个成员变量Class super_class,它指向父类的类对象。可以通过下图来进一步理解:
从上图中可以看出,D3继承D2,D2继承D1,D1最终继承NSObject。那么下图是从D3的一个对象开始,排列出D3 D2 D1 NSObject 类对象,元类对象等的关系,图中的箭头都是指针的指向:
4.根类NSObject
NSObject是大部分Objective-C类的根类,它没有父类。
其它类继承NSObject,访问Objective-C运行时系统的基本接口,这样其他类的实例可以获得运行时的能力。
- 根类和根类协议:NSObject不但是个类名,NSObject也是个协议的名称,参考NSObject协议,NSObject协议指定了根类必须实现的接口。
- 根类的主要方法:分配、初始化、复制
- 分配:alloc和allocWithZone:方法用于从某内存区域中分配一个对象内存,并使对象指向其运行时的类定义。
- 初始化:init方法是对象初始化。
- new是一个将简单的内存分配和初始化结合起来的方法。
- 复制:copy和copyWithZone
- 对象的保持和清理:
- retain方法增加对象的保持次数。
- release方法减少对象的保持次数。
- autorelease方法也是减少对象的保持次数,但是以推迟的方式。
- retainCount方法返回对当前的保持次数。
- dealloc方法由需要释放对象的实例变量以及释放动态分配的内存的类实现。
- NSObjec有很多方法可以查询对象的运行时信息。这些内省方法有助于找出对象在类层次中的位置,确定对象是否实现特定的方法,以及测试对象是否遵循某种协议。下面是部分方法
- superclass和class方法(实现为类和实例方法)分别以Class对象的形式返回接收者的父类和类。
- isKindOfClass:和isMemberOfClass:方法来确定对象属于哪个类。后者用于测试接收者是否为指定类的实例。isSubclassOfClass:类方法则用于测试类的继承性。
- respondsToSelector:方法用于测试接收者是否实现由选择器参数标识的方法。instancesRespondToSelector:类方法则用于测试给定类的实例是否实现指定的方法。
- conformsToProtocol:方法用于测试接收者(对象或类)是否遵循给定的协议。
- isEqual:和hash方法用于对象的比较。
- description方法允许对象返回一个内容描述字符串;这个方法的输出经常用于调试(“print object”命令),以及在格式化字符串中和“%@”指示符一起表示对象。
- 对象的编码和解码,下面的方法和对象的编解码(作为归档过程的一部分)有关:
- encodeWithCoder:和initWithCoder:是NSCoding协议仅有的方法。前者使对象可以对其实例变量进行编码,后者则使对象可以根据解码过的实例变量对自身进行初始化。
- NSObject类中声明了一些于对象编码有关的方法:classForCoder:replacementObjectForCoder:、和awakeAfterUsingCoder:。
- 消息的转发
- forwardInvocation:允许一个对象将消息转发给另一个对象
- 消息的派发
- 在performSelector开头的一些方法允许你延迟后派发指定消息,而且可以将消息(同步或异步的消息)从辅助线程派发到主线程。
5.Cocoa对象生命周期
对象的四种内存管理方式,如下图所示:
- 对象的生命周期—简化视图
- 保持接收到的对象
- 拷贝接收到的对象
- 自动释放池
五、iOS操作系统各层常用框架简述
1.Cocoa Touch Layer(触摸UI层)
-
AirDrop
AirDrop允许用户与附近设备共享图片、文档、urls链接以及其它种类的数据。
-
Text Kit
TextKit是处理文本和排版的一个全功能、高级别的类集合。
- 使用Text Kit我们能在段落、列或者页上对带有风格的文本进行布局;
- 也能在任意区域(如图形)周围布局流动的文本;
- 还能用它来管理多种字体。
- 开发应用时应该首先考虑使用Text Kit来进行文本呈现,而不是Core Text。
- Text Kit与所有UIKit中的基于文本的控制集成允许应用更容易地创建、编辑、显示和存储文本。
-
UIKit Dynamics
UIKit dynamics用来为符合UIDynamicItem协议的UIView对象或其它对象规定动画行为。
通过在应用的UI中集成真实世界行为和特性进,动画行为为应用提供了一种增强用户体验的方式。 -
Multitasking
在iOS中多任务用来设计来使电池使用时间最大化。
-
Auto Layout
自动布局帮助我们使用非常少的代码来建立动态接口。
使用AutoLayout定义如何在用户接口上布局元素的规则,这些规则表达了视图类之间的关系,如规定一个按钮总是处于它的父窗口的左边缘20个点。
在Auto Layout中使用的实体是被称为constraints的Objective-C对象。 -
Storyboards
“故事板”是设计应用用户接口的推荐方式。
“故事板”让我们在一个地方就能够设计全部的用户接口,方便在一个位置看到所有的视图和视图控制器以及理解它们是如何一起工作的。
“故事板”的一个重要的部分是定义segues(segues是从一个视图控制器到另一个的转换)。
这些转换代表用户接口之间的交互。“故事板”可以使用XCOE来可视的定义这些转换或者通过编程启动它们。
我们能使用一个单“故事板”文件来存储所有的应用视图控制器和视图,
或者使用多个视图串联图文件来组织用户接口。
在应用建立时间,Xcode读取“故事板”文件的内容并把它分成多个能独立加载的离散的片断,以便获得更好的性能。
UIKit框架提供了相应的类来从程序中存取一个“故事板”的内容。 -
UI State Preservation
UI状态保存能够使应用表现的一直运行,从而为用户提供无缝的体验。
如果系统遇到内存压力,系统可能安静地强制停止一个或多个后台应用。
当应用从前台移到后台时,该服务能保存应用的视图和视图控制器的状态。
在下次应用重新启动时,能够使用先前保存的状态信息来恢复视图和视图控制器到它们先前的配置,使应用表现得好像一直在运行。 -
Apple Push Notification Service
苹果的推送通知服务提供了一种提示用户关于新信息的方式,即使应用当前不在激活运行状态。
使用该服务,你能推送文本通知,在应用图标上增加一个标记或者在任意时间触发声音提示。
这些消息让用户知道他们应该打开应用来接收相关信息。自iOS7开始,我们甚至能推送无声的通知来让应用知道有了新的内容可以下载。
为了使用IOS应用的推送通知,用户需要做两部分的工作:- 第一、应用必须登记该通知服务以及在通知被提交时处理相关的通知数据。
- 第二、我们必须提供一个服务端的进程来产生通知。服务端的进程可以使用你自己的本地服务器或者使用苹果的推送通知服务。
-
Local Notifications
本地通知作为推送通知机制的补充,可以给应用提供一种不依赖外部服务器产生本地通知的方式。
运行在后头的应用能使用本地通知作为当重要的事件发生时引起用户注意的一种方式。例如,运行在后台的导航应用能使用本地通知来提示用户什么时间该转弯了。
应用也能调度本地通知在将来的时间提交以及使那些通知在应用不运行也能被提交。
本地通知的一个优点是它们与你的应用是独立的。
在一个通知已被调度,系统管理它的提交。另外当通知被提交时你的应用甚至不必运行。 -
Gesture Recognizers
手势识别用来检测通常类型的手势。
由于手势识别使用与系统检测手势相同的试探方法,因此手势识别为应用提供了一个一致的行为。
为了使用它,你能在你的视图上附加手势识别功能和并给它提供一个在手势出现时要执行的方法。
手势识别跟踪原始的触摸事件和确定它们什么时候与想要的手势匹配。 -
System View Controllers
许多系统框架为标准的系统接口定义了视图控制器。
只要有可能,为了呈现一致的用户体验,就应该使用系统提供的视图控制器而不是创建一个新的。
2.Cocoa Touch框架
-
Address Book UI Framework(地址本UI框架)
该框架提供一个面向对象的编程接口。
用来显示标准的系统接口,来创建新的联系人和编辑和选择已存在的联系人。 -
Event Kit UI Framework(月历事件UI框架)
该框架提供一个视图控制器来呈现标准的系统接口,来观察和编辑月历相关的事件。
EventKit UI Framework基于Event Kit framework框架。 -
Game Kit Framework(游戏工具框架)
该框架实现对游戏中心的支持,让用户能够在线共享他们的游戏相关的信息。
-
iAd Framework(iAD框架)
该框架用来在应用中提供广告条。当我们想要显示广告时,广告条与用户UI上的标准的视图进行合并。
这些视图与苹果的iAd服务一起工作,自动处理、加载和呈现富媒体广告以及应答在那些广告条上的点击等所有相关的工作。 -
Map Kit Framework(地图工具框架)
MapKit提供与应用的UI组合的一个可滚动的地图。
除了显示一个地图,你能使用该框架接口来定制地图的内容和外观,也能使用注解来标记感兴趣的点,也能使用定制的内容来与地图内容叠置。
例如,你可以在地图上来画一条公交路线,或者使用注解来高亮显示附近的商店和餐馆。
除了显示地图,MapKit框架还能与地图应用以及苹果的地图服务器集成来为用户指引方向。
地图应用能够给任意支持方向的应用提供方向的代理。
如提供特定类型方向的应用,例如一个显示地铁路线的应用,能登记请求接收地图应用提供的方向。
应用也能向苹果的服务器请求步行或驾驶方向,并与他们定制的方向的路径信息混合来为用户提供完整的点到点体验。 -
Message UI Framework( 消息UI框架)
该框架用来在应用中提供编辑邮件和sms消息的支持。
编辑支持包括一个呈现到你的应用的视图控制器接口,并能设置这个视图控制器的一些区域,如接收人、主题、邮件主体和邮件想包括的任意附件。
在呈现视图控制器后,也能为用户提供一个在发送邮件之前可以编辑邮件的选项。 -
UIKit Framework
该框架提供实现图形和事件驱动的应用的至关重要的基础。包括:
- 1)基本的应用管理和基础设施,包括应用的主循环;
- 2)用户接口管理,包括对storyboards和nib文件的支持;
- 3)一个用来封装用户UI内容的视图控制器模式;
- 4)标准v系统视图和控制对象;
- 5)提供处理触摸和运动事件的支持;
- 6)支持包括与iCloud集成功能的文档模式;
- 7)图形和窗口支持,包括支持外部显示器;
- 8)多任务支持;
- 9)打印支持;
- 10)定制标准UIKit控制的外观;
- 11)支持文本和web内容;
- 12)剪切、复制、粘贴的支持;
- 13)支持动画UI;
- 14)通过url语义和框架接口与系统提供的其它应用集成的能力;
- 15)对有障碍用户的可存取性的支持;
- 16)支持ApplePush Notification服务;
- 17)本地通知调度和提交;
- 18)pdf 创建;
- 19)支持定制像系统键盘行为一样的用户输入视图;
- 20)支持创建与系统键盘交互的定制的文本视图;
- 21)支持通过email,Twitter, Facebook和其它服务共享内容。也支持一些设备特定功能的集成,例如
- 1)内建的摄像机;
- 2)用户的图片库;
- 3)设备名和模式信息;
- 4)电池状态信息;
- 5)接近传感器信息;
- 6)来自附件耳机的远程控制信息
3.MediaLayer(媒体层)
包含的关键技术
-
图形技术
高质量的图形是所有应用的重要的组成部分。
iOS提供了许多帮助你定制艺术和图形屏幕的技术。
iOS图形技术为其提供了广泛的支持,并可以与UIKit视图架构无缝工作。
我们能使用标准的视图来快速提交高质量的接口,或者使用本层的图形技术创建我们自己的定制视图来提交一个更加丰富的图形体验。
- 1)UIKit graphics
- UIKit定义的绘制图像和Bézier路径,以及动画视图内容的高级别技术。
- UIKit视图提供快速和有效的方式来呈现图像和文本内容。
- UIKIT视图也能通过显示和使用UIKitdynamics技术进行动画,并为用户提供反馈,促进用户交互。
- 2)CoreGraphics 框架
- CoreGraphics也称作Quartz,是对定制的2D向量和图像呈现提供支持的本地绘制引擎。
- 该框架提供的引擎虽然没有OpenGLES引擎速度快,但该框架能够很好地适合于呈现定制的2d图形和动态图像。
- 3)CoreAnimation框架
- CoreAnimation也是Quartz核心框架的一部分,是优化应用动画体验的基础技术。
- UIKit视图基于 Core Animation提供视图级别的动画支持。
- 当你想对动画行为有更多控制时也能直接使用CoreAnimation。
- 4)Core Image
- CoreImage提供非破坏的方式操作视频和静态图像。
- 5)OpenGL ES及GLKit
- OpenGLES使用硬件加速接口来处理先进的2d 和3d 呈现。
- OpenGLES通常由游戏开发者或想实现沉浸式图像体验的开发者使用。
- OpenGLES 框架提供对呈现过程的全部控制,以及提供创建平滑动画所需要的帧速。
- GLKit是一组Objective-C类,以便能够使用面向对象接口来提供OpenGL ES的强大能力。
- 6)Text Kit和CoreText
- Text Kit是UIKit框架的家族,用来来执行最好的排面和文本管理。
- 如果你的应用实现先进的文本操作,Text Kit提供与应用视图的无缝集成。
- CoreText是处理先进排面和布局的低级别的c语言框架。
- 7)Image I/O
- ImageI/O提供读写大多数图像格式的接口。
- 8)Assets Library
- AssetsLibrary框架让你存取用户的图片、视频和媒体。
- 我们想在应用中集成用户自己的内容时可以使用该框架。
-
声音技术
声音技术工作于底层硬件之上,为用户提供更加丰富的声音体验。
这些体验包括播放和记录高质量的声音、处理MIDI内容以及使用设备内建的声音等能力。
- 1)Media Player framework
- 该框架是一个高级别的框架,用来为用户提供对iTunes库存取的容易方式,也提供对播放轨迹和播放列表的支持。
- 当你想快速在应用中集成声音以及不需要控制播放行为时可以使用该框架。
- 2)AV Foundation
- AVFoundation是管理声音以及视频播放和记录的面向对象接口。
- 在记录声音和想对声音播放过程有更好的控制时可以使用该框架。
- 3)OpenAL
- OpenAL是一个提供位置音效的跨平台的工业标准技术和接口。
- 游戏开发者经常使用该技术来提供高质量的声音。
- 4)Core Audio
-
Core Audio是一组简单和智能的接口来记录和播放声音以及MIDI内容。
-
在需要对声音有更好控制时使用该框架。
-
-
视频技术
视频技术提供管理应用中的静态视频内容或者播放来自Internet的视频流的支持。
对于带有适当的记录硬件的设备,该框架还能够记录视频以及与应用进行集成。- 1)UIImagePickerController
- UIImagePickerController是一个选择用户媒体文件的UIKit视图控制器。
- 2)Media Player
- MediaPlayer框架提供一组呈现视频内容的简单易用的接口,该框架支持全屏和小窗口视频播放,也为用户提供可选的播放控制。
- 3)AVFoundation
- AVFoundation提供先进的视频播放和记录能力。
- 在需要对视频呈现和记录有更多的控制时使用该框架,例如在实时应用中分层显示实时视频和应用提供的其它内容。
- 4)CoreMedia
- CoreMedia框架为操作媒体定义低级别的数据类型和接口。
- 当你需要对视频内容有无比的控制时可以使用该框架。
- 1)UIImagePickerController
-
AirPlay技术
AirPlay让应用串流声音和视频内容到Apple TV或者串流声音内容到第三方扬声器和接收器。
AirPlay内建于许多框架,包括UIKit、Media Player、AVFoundation、Core Audio。
因此在大多数情况你不需要为了支持它做任何事。
在使用那些框架时,当播放内容时自动获得AirPlay支持。当用户选择使用AirPlay播放内容时系统自动进行路由。
包含的框架和服务
-
Assets Library 框架
AssetsLibrary 框架(AssetsLibrary.framework)提供对用户设备上图片应用管理的图片和视频的存取。
使用该框架来存取用户保存的图片相册或导入到设备的任意相册中的图片,你也能保存新的图片和视频到用户的图片相册。 -
AV Foundation 框架
AVFoundation 框架 (AVFoundation.framework)提供一组播放、记录和管理声音和视频内容的Objective-C类。当你想在应用的ui接口无缝集成媒体能力时使用该框架。你也能使用它来进行更先进的媒体处理,例如同时播放多个声音或者控制播放和记录过程的多个方面。 该框架提供的服务包括:
- 1)声音会话管理,包括对系统声明你的应用声音能力;
- 2)对应用媒体资源的管理;
- 3)对编辑媒体内容的支持;
- 4)捕捉声音和视频的能力;
- 5)播放声音和视频的能力;
- 6)轨迹管理;
- 7)媒体元数据的管理;
- 8)立体拍摄;
- 9)声音之间的精确同步;
- 10)提供一个确定声音文件细节内容的Objective-C接口,例如数据格式,采样率,通道数;
- 11)通过AirPlay串流内容。
-
Core Audio 框架
Core Audio是一个对声音处理提供本地支持的框架家族。
这些框架支持声音的产生、记录、混合和回放。你也能使用这些接口处理MIDI内容以及串流声音和MIDI内容到其它应用。 Core Audio框架包括如下框架:
- 1)CoreAudio.framework
- 定义Core Audio框架使用的所有数据类型。
- 2)AudioToolbox.framework
- 提供声音文件和声音流的播放和记录服务。也提供管理声音文件,播放系统警告声音,在某些设备上触发震动的支持。
- 3)AudioUnit.framework
- 提供使用内建声音单元。也提供使你的应用的声音内容作为对其它应用可视的声音组件的支持。
- 4)CoreMIDI.framework
- 提供与MIDI设备通讯的标准方式,包括硬件键盘和合成器。
- 我们使用这个框架来发送和接收MIDI消息以及与通过dock连接器或网络连接到iOS设备的MIDI外设交互。
- MediaToolbox.framework 提供对声音tap接口的存取。
-
Core Graphics 框架
CoreGraphics.framework包含Quartz 2D绘制api。
Quartz是一个原先用在OS X的先进的、向量绘制引擎。
Quartz支持路径绘制,抗锯齿呈现,剃度,图像,颜色,坐标空间转换以及pdf 内容创建、显示和分析等功能。
虽然这个api是C-based接口,但它使用了面向对象抽象来表现基本的绘制对象,因此使它容易存储和重用图形内容。 -
Core Image 框架
CoreImage 框架(CoreImage.framework)提供一组强大的内建过滤器来操作视频和静态图像。
我们能在触摸弹起、纠正图片以及面部和特征检测等许多方面使用这些内建的过滤器。
这些过滤器的先进特点是它们操作在非破坏方式,即原先的图像不被改变。 这些过滤器针对底层硬件进行了优化,因此它们是快速和有效的。 -
Core Text 框架
CoreText 框架 (CoreText.framework)提供一个对文本进行布局和字体处理的简单的、高性能的C-based接口。
该框架用在不使用TextKit但仍想获得在字处理应用中发现的先进文本处理能力。
该框架提供了一个智能的文本布局引擎,包括在其它内容周围环绕文本的能力,它也支持使用多种字体和呈现属性的先进的文本风格。 -
Core Video 框架
CoreVideo 框架 (CoreVideo.framework)为Core Media框架提供缓冲和缓冲池支持。多数应用从不直接使用该框架。
-
Game Controller 框架
GameController框架(GameController.framework)让你在应用中发现和配置针对iPhone/iPod/iPad设备的游戏控制器。
游戏控制器可以是物理连接到iOS设备或者是通过蓝牙无线连接。
GameController框架当控制器可获得时通知你的应用让应用可以规定哪个控制器输入与你的应用相关。 -
GLKit 框架
GLKit框架 (GLKit.framework)包含一组简化创建OpenGLES应用的Objective-C based 单元类。 GLKit支持应用开发的四个关键领域
- 1)GLKView和GLKViewController类提供一个OpenGLES视图和其呈现循环的标准实现。 OpenGLES视图代表应用管理底层的framebuffer对象。应用只需在视图上绘制。
- 2)GLKTextureLoader类提供在我们的应用中使用图像转换和加载线程,允许应用自动加载纹理图像到应用的上下文。 能够异步或同步加载纹理。当异步加载纹理时,应用应提供一个完成处理块,该处理块在纹理加载进应用上下文时被调用。
- 3)GLKit框架提供向量、矩阵和3d 旋转以及提供OpenGLES 1.1上的矩阵。
- 4)GLKBaseEffect,GLKSkyboxEffect,和GLKReflectionMapEffect类实现给通用图形操作提供可配置的图形着色。尤其GLKBaseEffect类实现了OpenGL ES 1.1规范上的光亮和材质模式,简化了移植一个应用从OpenGL ES 1.1到OpenGL ES最后版本的努力。
-
Image I/O 框架
ImageI/O 框架(ImageIO.framework)提供输入和输出图像数据和图像元数据的接口。
该框架利用CoreGraphics数据类型和功能,并支持在iOS上所有的可获得的标准的图像类型。
我们能使用这个框架存取Exif和IPTC元数据属性。 -
Media Accessibility框架
MediaAccessibility 框架 (MediaAccessibility.framework)管理媒体文件中closed-caption内容的呈现。
该框架与新的设置配合工作可以让用户决定是否允许closed-caption显示。 -
Media Player 框架
MediaPlayer 框架(MediaPlayer.framework)提供应用中播放声音和视频的高级别支持。 能够使用该框架做如下工作:
- 1)播放视频到用户屏幕或通过AirPlay到另外的设备屏幕。能够全屏幕播放视频或以可改变视图大小的方式播放。
- 2)存取用户的iTunes音乐库。能够播放音乐轨迹和播放列表、搜索音乐、给用户提供一个媒体picker呈现接口。
- 3)配置和管理电影的回放。
- 4)在锁定屏幕和app 切换窗口上显示NowPlaying信息。当内容通过AirPlay提交时还能显示到AppleTV上。
- 5)检测视频通过AirPlay被串流的时间。
-
OpenAL 框架
OpenAudio Library (OpenAL)接口是用来在应用中提供位置音效的跨平台的标准。
能够使用该接口在游戏和其它需要位置音效输出的程序中实现高性能、高质量的声音。
因为OpenAL是跨平台的标准,在iOS使用OpenAL编写的代码能够容易地移植到许多其它平台。 -
OpenGL ES 框架
OpenGLES 框架 (OpenGLES.framework)提供绘制2d和3d内容的工具, 它是一个C-based的框架。 该框架以最接近设备硬件的方式为全屏沉浸式应用例如游戏提供细粒度的图形控制和高的帧率。
我们能够与EAGL配合使用这个框架,为OpenGL ES 绘制调用和UIKit的本地窗口对象之间提供接口。
该框架支持OpenGLES 1.1, 2.0, 3.0规范。
2.0规范增加了片段和顶点着色的支持,3.0规范增加了更多的功能,包括多个呈现目标和变换反馈。 -
Quartz Core 框架
QuartzCore 框架(QuartzCore.framework)包含Core Animation接口。
Core Animation是一个先进的复合技术,使用它能容易创建快和有效的view-based的动画。
复合引擎利用底层硬件来有效的实时操作视图内容。
只需规定动画的起始点,CoreAnimation做剩下的工作。
因为Core Animation内嵌在UIView架构的底层,因此它总是可用的。 -
Sprite Kit 框架
SpriteKit 框架 (SpriteKit.framework)框架为2d和2.5d游戏提供硬件加速的动画系统。
SpriteKit提供大多数游戏需要的基础,包括一个图形引擎和动画系统,声音播放支持,一个物理仿真引擎。\ 使用SpriteKit不需你自己创建这些事情,使你聚焦在内容设计和内容的高级别的交互上。
在Sprite Kit应用中内容组织为场景。
一个场景包括纹理对象,视频,路径图形,核心图像过滤器和其它的特效。SpriteKit利用这些对象,确定这些对象到屏幕上的最有效的方式。
当在场景中到了动画内容的时刻,你能使用SpriteKit来显式规定你想执行的行动或使用物理仿真引擎来为那些 对象定义物理行为(例如重力、引力或排拆力)。
除了SpriteKit框架,也有其它Xcode工具来创建颗粒发射效果和纹理图。
我们能使用Xcode工具来管理应用资源和快速地更新Sprite Kit场景。
4.CoreServices Layer(核心服务层)
包含的高级功能:
-
Peer-to-Peer Services(点到点服务)
这个Multipeer Connectivity框架提供通过蓝牙进行p2p连接的能力。
你能使用p2p连接来启动与附近设备的通讯会话。
虽然p2p连接主要用在游戏中,你也能在其它类型的应用中使用这个功能。 -
iCloud Storage(云存储)
iCloud存储让应用把用户文档和数据写到一个中心位置,用户然后能从他们的计算机和iOS设备存取这些数据。
使用iCloud可以使用户文档无所不在,意味着用户能从任何设备阅读或编辑那些文档,而不需要显式的同步或文件传输。
存储文档到用户的iCloud账户也为用户提供了一层安全。
即使用户的设备丢失,那些设备上的文档如果已经保存到iCloud就不会丢失。
应用能以两种方式使用 iCloud存储,每一种有不同的使用意图:- 1)iCloud文档存储。
- 可以使用这个功能在用户的iCloud账户存储用户文档和数据。
- 大多数应用使用iCloud文档存储来共享来自用户账户的文档。
- 使用iCloud文档存储用户关心的是文档能否能够在设备之间共享以及他们是否能够从一个给定设备查看和管理那些文档。
- 2)iCloud键值存储。
-
使用这个功能在应用之间共享数据。
-
iCloud键值存储是应用与应用的其它实例共享小量数据(几十k字节)的方式,应用应当用它存储非紧急的应用数据,例如设置。
-
- 1)iCloud文档存储。
-
Automatic Reference Counting(自动引用计数)
AutomaticReference Counting(ARC)是一个编译级别的功能,用它来简化Objective-C对象生命周期过程的管理,以此代替用户必须记住什么时候应该保持和释放对象。
ARC评估对象的生命周期需求和自动在编译时间插入适当的方法调用。
ARC用来代替iOS的早期版本中存在的传统的管理内存的编程模式。
新创建的工程自动使用ARC。Xcode也提供了移植工具帮助我们转换遗留的工程来使用ARC. -
Block Objects(块对象)
BlockObjects是一个能够与你的C或Objective-C代码集成的C语言的构造块。
一个blockobject本质上是一个异步功能和相关的数据。
在其它语言中有时也被称做closure或lambda。
Blocks尤其用作回调或放在你需要一种容易的组合执行代码和相关数据方式的地方。
在iOS,通常在下面的场景使用Blocks:- 1)作为代理或代理方法的代替;
- 2)作为回调功能的代替;
- 3)为某个一次性操作实现其完成处理函数;
- 4)在一个集合中的所有项上执行一个任务;
- 5)与提交队列一起执行异步任务。
-
Data Protection(数据保护)
DataProtection允许应用利用设备上已有的内建的加密方法来使用用户的敏感数据。
当应用指定一个特定的文件被保护时,系统在磁盘上以加密格式存储该文件。
当设备锁定时,该文件的内容不能被应用和任何潜在的侵入者存取。
可是当设备由用户解锁时,一个解密key被创建允许你的应用存取那个文件。
用户也可以使用其它级别的数据保护机制。
实现数据保护需要你考虑如何创建和管理你想保护的数据。
应用必须设计在数据的创建时间加密数据,以及当用户锁定或解锁设备时为存取条件改变做好准备。 -
File-Sharing Support(文件共享支持)
File-SharingSupport使用户数据文件在iTunes 9.1和以后上可被其它应用获得。
一个应用声明支持文件共享使它的/Documents目录下的内容对其它用户可获得。
用户然后当需要时能够把文件从iTunes移进或移出应用的Documents目录。
这个特征不允许应用与相同设备上的其它应用共享应用,这需要粘贴板或一个文档交互控制器对象。
应用为了允许文件共享支持,需要做如下工作:- 1)在应用的Info.plist文件中增加UIFileSharingEnabled键,并设置其值为YES。
- 2)在你的应用的Documents中放你想共享的文件;
- 3)当设备插进用户的计算机时,iTunes在选中设备的Apps标签下显式一个文件共享节;
- 4)用户然后能够增加文件到设备的文档目录或移动文件到桌面。
支持文件共享的应用应该能够识别文件什么时候增加到其Documents目录和做出适当的应答。
例如应用可以使任意新文件的内容可以从它的接口获得。也应该从不把Documents目录的文件列表呈现给用户来请求用户决定对那些文件做什么。
-
Grand Central Dispatch
GrandCentral Dispatch(GCD)是一个BSD技术,应用可以用来管理其任务的执行。
GCD与高优化的核组合成一个异步编程模式,来提供方便和更有效的对线程的替代。
GCD也为许多低级别的任务提供一个方便的选择,例如读和写文件描述符,实现定时器和监视信号和处理事件。 -
In-App Purchase(应用内购买)
In-App Purchase 提供在应用中销售应用特定的内容和服务以及来自iTunes的内容的能力。
这个功能使用StoreKit框架实现,并提供使用用户的iTunes账号来处理金融方面的事务需要的基础。
应用处理全部用户体验和供购买的内容及可获得服务的呈现。
作为可下载的内容,你能把可下载的内容放到你自己的服务器或使用苹果的服务器。 -
SQLite
SQLite库让你在你的应用中嵌入一个轻量级的sql数据库,而不需要运行一个分离的远程数据库服务进程。
从你的应用,你能创建本地数据库文件,管理数据库表和表中的数据记录。 SQLite库为通用功能使用设计,但已经被优化来提供对数据记录更快速的存取。 -
XML Support
Foundation框架提供一个NSXMLParser类用来从一个xml文档中引出元素。
操作xml内容的额外的支持由libxml2库提供支持。
libxml2开源库让你快速地分析或写任意的xml数据和转换xml内容到html。
5.Core OS Layer(核心OS层)
Core OS包含的框架:
-
Accelerate 加速框架
Accelerate框架 (Accelerate.framework)包含执行数字信号处理、线性代数、图像处理计算的接口。
使用该框架的优点是它们针对所有的iOS设备上存在的硬件配置做了优化,因此你能写一次代码确保在所有设备上有效运行。 -
Core Bluetooth Framework(核心蓝牙框架)
CoreBluetooth 框架 (CoreBluetooth.framework)允许开发者与蓝牙低耗电外设(LE)交互。 使用该框架的Objective-C接口能够完成如下工作:
- 1)扫描蓝牙外设,连接和断开发现的蓝牙外设;
- 2)声明应用的服务,转换ios 设备成其它蓝牙设备的外设;
- 3)从IOS设备广播iBeacon信息;
- 4)保存你的蓝牙连接的状态,当应用重新启动时恢复那些连接;
- 5)蓝牙外设可获得性变化时获得通知。
-
External Accessory Framework(外部附件框架)
ExternalAccessory 框架(ExternalAccessory.framework)提供与连接到IOS设备的硬件附件通讯的支持。
附件能通过30-pin连接器或使用蓝牙无线与iOS设备进行连接。
该框架给我们提供了获得关于每一个可获得的附件信息和启动通讯会话的方式。
然后,我们可自由的使用附件支持的命令直接操作附件。\ -
Generic Security Services Framework(通用安全服务框架)
GenericSecurity Services 框架 (GSS.framework)给ios应用提供一组标准安全相关的服务。
该框架的基本接口规定在IETFRFC2743 andRFC4401。
除了提供标准的接口,iOS还包括一些没有在标准中规定但被许多应用需要的一些管理证书需要的额外东西。 -
Security Framework(安全框架)
除了内建的安全功能,iOS也提供了一个明确的安全框架(Security.framework),你能用它来保证应用管理的数据的安全。
该框架提供管理证书、公有和私有key和信任策略的接口,支持产生加密安全伪随机码。
它也支持在keychain(保存敏感用户数据的安全仓库)中保存证书和加密key。
公共加密库提供对称加密、hash认证编码(HMACs)、数字签名等额外支持,数字签名功能本质上与iOS上没有的OpenSSL库兼容。
在我们创建的多个应用之间共享keychain是可能的。
共享使它容易在相同的一套应用之间更平滑的协作。
例如,你能使用该功能来共享用户口令或其它元素,否则可能使每个应用都需要提示用户。
为了在应用之间共享数据,必须为每个应用的Xcode工程配置适当的权限。 -
System
System级包含kernel环境、驱动以及操作系统级别的unix接口。
kernel本身负责操作系统的每一个方面:如虚拟内存管理、线程、文件系统、网络和互联通信。
在该层的驱动也提供在可获得的硬件与系统框架之间的接口。
为了安全,对kernel和驱动的存取被限制到一组有限的系统框架和应用。
iOS提供一组存取许多操作系统低级别功能的接口。
应用通过LibSystem库存取这些功能。
该C based的接口提供如下功能的支持:-
- 多任务(POSIX线程和GCD)
-
- 网络(BSDsockets)
-
- 文件系统存取
-
- 标准I/O
-
- Bonjour和DNS服务
-
- 位置信息
-
- 内存分配
-
- 数学计算
-
-
64-Bit Support
iOS原先是为32-bit架构的设备设计的。
自iOS 7,开始支持在64-bit进行编译、链接和调试。
所有的系统库和框架是支持64位的,意味着它们能在32-bit和64-bit应用中使用。
当以64-bit运行时编译时,应用可能运行的更快,因为在64-bit模式可以获得额外的处理器资源。
iOS使用OS X和其它64-bitUNIX系统使用的LP64模式,意味着在这些系统移植时不会碰到太头疼的事。
关联系列文章:
后记
欢迎编程江湖的各路朋友阅览与点评我的博客,若您觉得我的这篇文章对你的工作有所帮助,我深感欣慰。您也可以动一动小手,将它分享到其它iOS开发者面前,衷心希望更多的朋友一起来促进这伟大社区的发展,一起让这编程世界更加磅礴隽永。
我将会在未来投入更多精力继续为朋友们争取输出优质文章,也欢迎你关注我,非常感谢!!
[TOC]