再读斋

iOS开发之01基础

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工程目录

code中的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
Twitter 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 提供用户指定的安全策略进行安全认证
刘涤生 wechat