有一次很好奇跟一个同事讨论,当我们触摸屏幕后,整个iOS系统是如何运转?实际开发中,我们都会应用UIGestureRecognizer或者UIRespose去处理事件,但是很少有人能准确回答出屏幕如何接收触摸,系统如何处理的触摸?
本文就来刨根问底,“触摸屏幕”究竟引起了那些连锁反应,那些框架参与其中。
上图是苹果官网总结从iOS开发者的角度给出的简图,注意我的用词,“iOS开发者的角度”和“简图”,这极度反应出苹果官方文档对整个事件的模糊处理,因为更多开发者只关心应用怎么处理各种事件。
整个iOS应用响应手指触摸后的一系列流程,整个生命周期我概括为3个阶段:系统响应 -> 桌面处理 -> App处理。
系统响应
桌面处理
App处理
概念
上面的“触摸事件全流程”中有很多重要的概念,再次做一个解释和扩展。
- Events
Events in iOS represent fingers touching views of an application or the user shaking the device。
这是官网对Events的定义,翻译过来就是iOS事件表示手指触摸应用程序视图或者用户摇动设备。从定义入手,我们可以将事件分为两类:“触摸事件”和“运动事件”,实际上,iOS中还有一种“远程事件”,比如耳机操作等,本文主要探讨的是“触摸事件”,因此本文很多“事件”是“触摸事件”的简称。
- UITouch
An object representing the location, size, movement, and force of a touch occurring on the screen.
表示屏幕上发生的触摸的位置,大小,移动和力度的对象。
- UITouch.png
UIEvent
An object that describes a single user interaction with your app.
描述单个用户与您的应用交互的对象。
-
UIResponder
UIResponder.png Target-Action
Darwin
核心操作系统层就是我们经常提到的Darwin,Darwin(达尔文)是苹果公司于2000年发布的一个开源操作系统,Darwin是macOS 和 iOS的一部分。可以将Darwin理解为操作系统的代号。Darwin由XNU和一些其他的Darwin库组成。XNU
XNU是由苹果公司发布的操作系统内核,即Darwin的内核是XNU,是Darwin操作系统的一部分。除macOS外,XNU还是iOS、tvOS、watchOS操作系统的内核。XNU是X is not Unix的缩写。XNU包含三部分:Mach内核、BSD、I/O Kit。Mach
XNU内核以一个被深度定制的Mach3.0内核作为基础。Mach是一个由卡内基梅隆大学开发的计算机操作系统微内核,主要是为了用于操作系统研究,特别是在分布式与并行运算上。XNU中的Mach所负责的功能非常少(核心功能),只能完成操作系统最基本的职责,比如任务调度、消息传递、进程间通信等。BSD
BSD,伯克利软件套件(Berkeley Software Distribution),也被称为伯克利Unix(Berkeley Unix),是一个操作系统的名称。XNU中的BSD部分提供了POSIX应用程序接口(BSD系统称之为API):进程模型、网络协议栈、虚拟文件系统等。IOKit
IOKit是一个设备驱动框架,为开发者提供了开发设备驱动程序的API。
- SpringBoard.app
SpringBoard.app是一个系统进程,可以理解为桌面系统,可以统一管理和分发系统接收到的触摸事件。