有一次很好奇跟一個同事討論,當我們觸摸屏幕后,整個iOS系統(tǒng)是如何運轉(zhuǎn)?實際開發(fā)中,我們都會應用UIGestureRecognizer或者UIRespose去處理事件,但是很少有人能準確回答出屏幕如何接收觸摸,系統(tǒng)如何處理的觸摸?
本文就來刨根問底,“觸摸屏幕”究竟引起了那些連鎖反應,那些框架參與其中。

上圖是蘋果官網(wǎng)總結(jié)從iOS開發(fā)者的角度給出的簡圖,注意我的用詞,“iOS開發(fā)者的角度”和“簡圖”,這極度反應出蘋果官方文檔對整個事件的模糊處理,因為更多開發(fā)者只關心應用怎么處理各種事件。
整個iOS應用響應手指觸摸后的一系列流程,整個生命周期我概括為3個階段:系統(tǒng)響應 -> 桌面處理 -> App處理。
系統(tǒng)響應
桌面處理
App處理
概念
上面的“觸摸事件全流程”中有很多重要的概念,再次做一個解釋和擴展。
- Events
Events in iOS represent fingers touching views of an application or the user shaking the device。
這是官網(wǎng)對Events的定義,翻譯過來就是iOS事件表示手指觸摸應用程序視圖或者用戶搖動設備。從定義入手,我們可以將事件分為兩類:“觸摸事件”和“運動事件”,實際上,iOS中還有一種“遠程事件”,比如耳機操作等,本文主要探討的是“觸摸事件”,因此本文很多“事件”是“觸摸事件”的簡稱。
- UITouch
An object representing the location, size, movement, and force of a touch occurring on the screen.
表示屏幕上發(fā)生的觸摸的位置,大小,移動和力度的對象。
- UITouch.png
UIEvent
An object that describes a single user interaction with your app.
描述單個用戶與您的應用交互的對象。

-
UIResponder
UIResponder.png Target-Action
Darwin
核心操作系統(tǒng)層就是我們經(jīng)常提到的Darwin,Darwin(達爾文)是蘋果公司于2000年發(fā)布的一個開源操作系統(tǒng),Darwin是macOS 和 iOS的一部分。可以將Darwin理解為操作系統(tǒng)的代號。Darwin由XNU和一些其他的Darwin庫組成。XNU
XNU是由蘋果公司發(fā)布的操作系統(tǒng)內(nèi)核,即Darwin的內(nèi)核是XNU,是Darwin操作系統(tǒng)的一部分。除macOS外,XNU還是iOS、tvOS、watchOS操作系統(tǒng)的內(nèi)核。XNU是X is not Unix的縮寫。XNU包含三部分:Mach內(nèi)核、BSD、I/O Kit。Mach
XNU內(nèi)核以一個被深度定制的Mach3.0內(nèi)核作為基礎。Mach是一個由卡內(nèi)基梅隆大學開發(fā)的計算機操作系統(tǒng)微內(nèi)核,主要是為了用于操作系統(tǒng)研究,特別是在分布式與并行運算上。XNU中的Mach所負責的功能非常少(核心功能),只能完成操作系統(tǒng)最基本的職責,比如任務調(diào)度、消息傳遞、進程間通信等。BSD
BSD,伯克利軟件套件(Berkeley Software Distribution),也被稱為伯克利Unix(Berkeley Unix),是一個操作系統(tǒng)的名稱。XNU中的BSD部分提供了POSIX應用程序接口(BSD系統(tǒng)稱之為API):進程模型、網(wǎng)絡協(xié)議棧、虛擬文件系統(tǒng)等。IOKit
IOKit是一個設備驅(qū)動框架,為開發(fā)者提供了開發(fā)設備驅(qū)動程序的API。

- SpringBoard.app
SpringBoard.app是一個系統(tǒng)進程,可以理解為桌面系統(tǒng),可以統(tǒng)一管理和分發(fā)系統(tǒng)接收到的觸摸事件。

