【译】为避免撕逼,提前声明:本文纯属翻译,仅仅是为了学习,加上水平有限,见谅!
初始化应用并准备运行
概述
UIKit做的大部分工作实际上是启动应用并准备运行。UIKit创建UIApplication对象用来管理应用,加载初始视图和视图控制器并开始应用主事件循环。UIKit也会创建应用委托——一个遵守UIApplicationDelegate协议的对象。新Xcode工程包含你可以自定义并用来处理特定启动任务的应用委托对象。在启动时使用这个对象执行下面的一些或所有任务:
当应用第一次启动时,执行所需要的任何一次性设置。
初始化应用数据结构。
配置UI的视图和视图控制器。
验证应用内容。
启动应用任何需要运行的任务。例如,连接你需要的网络资源。
应用委托中有两个方法(如列表1所示)只在启动的时候调用。使用application:willFinishLaunchingWithOption:方法初始化应用数据结构并执行一次性设置任务。(这个方法调用的同时,UIKit已经从storyboard文件中加载了应用的默认用户界面。)使用application:didFinishLaunchingWithOption:方法去验证内容,更新用户默认的用户界面,并且可以启动任意任务。
列表1
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]? = nil) -> Boll {
// Override point for customization after app launch,
// but before state restoration
return true
}
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for app customization
// Perform final customization of your user interface.
}
}
应用的用户界面任然保持隐藏状态,直到两个初始化方法把控制权返回给UIKit。仅当应用无法正常运行的时才会同步的执行任务。例如,你必须同步的配置用户界面。在后台调度队列异步的启动其他的所有任务。特别的,在后台开始所有的网络请求,并在获取数据时让用户执行其他任务。
确定应用启动的原因
用户可以通过点击主屏上的图标来启动应用,系统还可以通过响应特定的事件启动应用。当系统启动应用时,它会在application:willFinishLaunchingWithOptions:和application:didFinishLaunchingWithOptions:方法传递的字典对象中提供启动原因。
使用在启动选项字典中的键去了解应用启动的原因并提供适当的响应。字典可能只包含在那存在的键。例如,如果应用在后台处理位置更新,当新位置事件可用的时候,字典就会包含UIApplicationLaunchOptionsLocationKey键。列表2展示了如何查找这个键,配置位置管理对象并启动位置服务,这会向位置管理委托发送一个事件。
列表2
class Application: UIResponder, UIApplicationDelegate, CLLocationManagerDelegate {
let locationManager = CLLocationManager()
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// if launched because of new location data,
// start the visits service right away.
if let keys = launchOptions?.keys {
if keys.contains(.location) {
locationManager.delegate = self
locationManager.startMonitoringVisits()
}
}
return true
}
// other methods...
}
启动选项键值列表和关于如何处理它们的信息,请看UIApplicationLaunchOptionsKey
话题
启动时间
关于应用的启动顺序
了解自定义代码在启动时的执行顺序。
执行应用的一次性设置
保证应用环境可以正常的配置。