Xcode中的iOS工程模板
iOS工程模板分为两类-Application和Framework & Library。
Application类型
Application包含5个模板,具体如下所示:
- Master-Detail Application:可以构建树形结构导航模式应用,生成的代码中包含了导航控制器和表视图控制器等。
 - Page-Based Application:可以构建类似电子书效果的应用
 - Single View Application:可以构建简单的单个视图应用
 - Tabbed Application:可以构建标签导航模式的应用,生成的代码中包含了标签控制器和标签栏等。
 - Game: 可以构建基于iOS的游戏应用
 
Framework & Library
- Cocoa Touch Framework 可以让开发者自定义应用于UIKit的框架
 - Cocoa Touch Static Library 可以让开发者创建基于Foundation框架的静态库。
 
Xcode中的iOS工程目录

- AppDelegate.swift类文件:应用程序委托对象
 - ViewController.swift类文件:是视图控制器类,在工程中扮演着根视图和用户事件控制类的角色
 - Main.storyboard文件:故事板文件
 - LaunchScreen.storyboard:应用启动界面故事板文件
 - Assets.xcassets文件夹: 资源目录,可以用来管理图片
 - Info.plist:工程属性文件
 - Products组:工程将要生成的产品包
 
在访问资源文件时,文件夹和组是有区别的。访问文件夹中的资源时需要将文件夹作为路径。如果icon.png文件放在images文件夹下,则访问它的路径时images/icon.png,如果images是组,则访问它的路径是icon.png.
iOS应用生命周期
AppDelegate类在应用生命周期的不同阶段会回调不同的方法。首先介绍iOS应用的5中状态。
- Not Running(非运行状态):应用没有运行或被系统终止
 - Inactive(前台非活动状态):应用正在进入前台状态,但是还不能接受事件处理
 - Active(前台活动状态):应用进入前台状态,能接受事件处理
 - Backgroud(后台状态):应用进入后台状态,依然能够执行代码。如果有可执行的代码,就会执行代码;如果没有可执行的代码或者将可执行的代码执行完毕,应用会马上进入挂起状态
 - Suspend(挂起状态):被挂起的应用不能执行代码。如果系统内存不够,应用会被终止。
 
在应用状态切换的过程中,iOS系统会回调AppDelegate中的一些方法,并且发送一些通知。下面介绍几个主要的方法和通知。
| 方法 | 本地通知 | 说明 | 
|---|---|---|
| application:didFinishLaunchingWithOptions | UIApllicationDidFinishedLaunchingNotification | 应用启动并进行初始化时会调用该方法并发出通知。这个阶段会实例化根视图控制器 | 
| applicationDidBecomeActive | UIApplicationDidBecomeActiveNotification | 应用进入前台并处于活动状态时调用该方法并发出通知。这个阶段可以恢复UI的状态 | 
| applicationWillResignActive | UIApplicationWillResignActiveNotification | 应用从活动状态进入到非活动状态时调用该方法并发出通知。这个阶段可以保存UI状态 | 
| applicationDidEnterBackgroud | UIApplicationDidEnterBackgroudNotification | 应用进入后台时调用该方法并发出通知。这个阶段可以保存用户数据,释放一些资源 | 
| applicationWillEnterForegroud | UIApplicationWillEnterForegroudNotification | 应用进入到前台,但是还没有处于活动状态时调用该方法并发出通知。这个阶段可以恢复用户数据 | 
| applicationWillTerminate | UIApplicationWillTerminateNotification | 应用被终止时调用该方法并发出通知,但内存清除时除外,这个阶段释放一些资源,也可以保存用户数据 | 
非运行状态-应用启动场景
场景描述:用户点击应用图标时,可能是第一次启动这个应用,也可能是应用终止后再次启动。该场景的状态跃迁过程共经历两个阶段单个状态:Not running -> Inactive -> Active。
- Not running -> Inactive阶段:调用application:didFinishLaunchingWithOptions方法,发出UIApllicationDidFinishedLaunchingNotification通知。
 - Inactive -> Active阶段:调用applicationDidBecomeActive方法,发出UIApplicationDidBecomeActiveNotification通知。
 
点击Home键-应用退出场景
场景描述:应用出于运行状态(即Active状态)时点击Home键应用会退出。该场景的状态变迁过程分为两种情况:可以在后台运行或者挂起和不可以在后台运行或挂起,可以根据工程属性文件Info.plist中的属性Application does not run in background来控制这两种状态。
应用可以在后台运行或者挂起
该场景的状态变迁共经历3个阶段4个状态:Activie -> Inactive -> Backgroud -> Suspend。
- Activie -> Inactive阶段:调用applicationWillResignActive方法,发出UIApplicationWillResignActiveNotification通知。
 - Inactive -> Backgroud阶段:应用从非活动状态进入到后台(不涉及重点的方法和通知)。
 - Backgroud -> Suspend阶段:调用applicationDidEnterBackground方法,发出UIApplicationDidEnterBackgroudNotification通知。
 
应用不可以在后台运行或挂起
该场景下的状态变迁共经历4个阶段5种状态:Activie -> Inactive -> Backgroud -> Suspend -> Not Running。
- Activie -> Inactive阶段:调用applicationWillResignActive方法,发出UIApplicationWillResignActiveNotification通知。
 - Inactive -> Backgroud阶段:应用从非活动状态进入到后台(不涉及重点的方法和通知)
 - Backgroud -> Suspend阶段:调用applicationDidEnterBackground方法,发出UIApplicationDidEnterBackgroudNotification通知
 - Suspend -> Not Running阶段:调用applicationWillTerminate方法,发出UIApplicationWillTerminateNotification通知。
 
挂起重新运行场景
场景描述:挂起状态的应用重新运行。该场景的状态变迁过程共经历三个阶段4种状态:Suspend -> Backgroud -> Inactive -> Active。
- Suspend -> Backgroud阶段:应用从挂起状态进入到后台(不涉及重点的方法和通知)
 - Backgroud -> Inactive:调用applicationWillEnterForeground方法,发出UIApplicationWillEnterForegroudNotification通知。
 - Inactive -> Active:调用applicationDidBecomeActive方法,发出UIApplicationDidBecomeActiveNotification通知。
 
内存清楚-应用终止场景
场景描述:应用在后台处理完成时进入挂起状态(这是一种休眠状态),如果这时发出低内存警告,为了满足其他应用对内存的需要,该应用就会被清除内存从而终止运行。该场景的变迁过程为:Backgroud -> Suspend -> Not running。
内存清除的时候应用终止运行。内存清除有两种情况,可能是系统强制清楚内存,也可能是由使用者从任务栏中手动清除。内存清除后如果应用再次运行,上一次的运行状态不会被保存,相对于应用第一次运行。
在内存清除的场景下,应用不会调用任何方法,也不会发出任何通知。
iOS API 简介
iOS的整体架构图参见图2-28,分为4层-Cocoa Touch层,Media层,Core Service层和Core OS层。
Cocoa Touch层
Cocoa Touch层提供了构建iOS应用的一些基本系统服务(如多任务、触摸输入和推送通知等)和关键框架。
| 框架 | 前缀 | 说明 | 
|---|---|---|
| ConatactsUI | CN | 访问通讯录相关UI类 | 
| EventKitUI | EK | 访问日历事件数据 | 
| GameKit | GK | 提供能够进行点对点通信的网络通信API | 
| iAd | AD | 广告API | 
| MapKit | MK | 地图API | 
| MessageUI | MF | 电子邮件消息相关API | 
| PhotosUi | PF | 照片API | 
| TW | 提供发送Twitter API | |
| UIKit | UK | 提供UI类 | 
| WatchKit | Wk | Apple Watch相关类 | 
Media层
Media层提供了图形、音频、视频和AirPlay技术等。
| 框架 | 前缀 | 说明 | 
|---|---|---|
| Assets Library | Al | 访问图片和视频的API | 
| AudioToolBox | Audio | 录制或播放视频、音频流以及格式转换 | 
| AudioUnit | Audio、AU | 使用内置音频单元服务以及音频处理模块 | 
| AV Foundation | AV | 播放与录制音频和视频的OC API | 
| Core Audio | Audio | 录制、制作、播放音频的C语言接口 | 
| Core Graphics | CG | 提供Quartz 2D接口 | 
| Core Image | CI | 操作视频和静态图像的接口 | 
| Core MIDI | MIDI | 处理MIDI数据的底层API | 
| Core Text | CT | 渲染文本和处理字体的简单、高效的C语言接口 | 
| Core Video | CV | 处理音频和视频的API | 
| Image I/O | CG | 读写图像数据类 | 
| GLKit | GLK | 构建复杂OpenGL ES应用的OC应用类 | 
| Media Player | MP | 播放接口 | 
| OpenAl | AL | 包含了OpenAL(跨平台)的C接口 | 
| OpenGL ES | GL | 包含OpenGL ES(跨平台的2D/3D图形库)的C语言接口 | 
| Quartz Core | CA | 提供动画接口类 | 
| Sprite Kit | SK | 苹果提供的基于2D游戏的开发引擎 | 
| Scene Kit | SCK | 一种高级别的3D图像框架,能创建3D动画场景和特效 | 
Core Services层
Core Services层提供了CloudKit、HealthKit、HomeKit、SQLite和XML支持等技术
| 框架 | 前缀 | 说明 | 
|---|---|---|
| Accounts | AC | 用于访问用户的Twitter账户 | 
| Contacts | CN | 访问通讯录信息 | 
| AdSupport | AS | 获得iAd广告标识 | 
| CFNetwork | CF | 提供了访问Wi-Fi网络和蜂窝移动网络的API | 
| Core Data | NS | 提供管理应用数据的ORM接口 | 
| CoreFoundation | CF | 最基本的框架包括数据集 | 
| Core Location | CL | 定位服务的API | 
| CoreMedia | CM | 提供AV Foundation框架使用的底层媒体类型,可以精确控制音频或视频的创建及展示 | 
| CoreMotion | CM | 接收和处理重力加速度以及其他的运动操作 | 
| CoreTelephony | CT | 提供访问电话基本信息的API | 
| Event Kit | EK | 访问日历事件数据 | 
| Foundation | NS | 是OC最基本的框架 | 
| JavaScriptCore.framework | JS | 实现OC与JS的相互调用 | 
| MobileCoreServices | UT | 定义统一标识符类型(UIT)使用的底层类型 | 
| Newsstand Kit | NK | 提供在后台下载杂志和新闻的API接口 | 
| Pass Kit | PK | 提供访问优惠券的API | 
| QuickLock | QL | 提供预览无法直接查看的文件内容 | 
| Social | SL | 提供社交网络访问API,中国区提供新浪微博的API | 
| Store Kit | SK | 提供处理应用内置收费的资金交易 | 
| SystemConfiguration | SC | 用于确定设备的网络配置,也可以用于判断某个主机服务是否可以使用 | 
| Cloud Kit | CK | 开发iCloud应用的API | 
| Health Kit | HK | 开发健康和健身等服务的API | 
| Home Kit | HM | 能够与用户家中连接的设备通信并进行控制 | 
Core OS层
Core OS层提供了一些低级功能,一般不直接使用它。
| 框架 | 前缀 | 说明 | 
|---|---|---|
| Accelerate | AC | 访问重力加速计API | 
| Core Bluetooth | CB | 访问低功耗蓝牙设备API | 
| External Accessory | EA | 访问外围配件API接口 | 
| Generic Security Services | GSS | 提供一组安全相关的服务 | 
| Security | CSSM | 管理证书、公钥、私钥和安全信任策略的API | 
| LocalAuthentication | LA | 提供用户指定的安全策略进行安全认证 |