C3.31.1System gestures preempt the app event stream设计研究

系统手势的判定发生在应用收到触摸事件之前,应用无法提前拦截

别名: 系统先判 · 事件拦截 · gesture preemption

概念解释

边缘返回、底边上滑回主屏、状态栏下拉等系统手势在应用进程看到触摸之前就已经由窗口服务器或系统手势识别器判定。应用不能在 touchesBegan 里“抢先”把它们关掉。优先级是架构位置,不是应用内识别器排序能改写的规则。

机制

触摸先进入系统合成器。匹配系统手势的热区与形状时,事件被认领或被复制给系统,应用收到的是延迟、残缺或根本没有的流。这保证返回与回主屏在任意应用里都活着,包括卡死的应用。代价是应用对同形运动无能为力:左边沿滑既可能是系统返回,也可能是应用的抽屉,应用直到系统放弃才知道自己有没有机会。调试时看到“应用没收到 began”,根因往往在这一层,而不是业务代码写错。

怎么研究

在系统手势热区与应用热区重叠处录系统日志与应用日志的时间线,标出系统认领帧与应用第一帧。比较“系统成功 / 应用成功 / 两者都失败”。不要只在应用内打点——那会把被系统吃掉的手势看成“用户没做”。

边界

鼠标、键盘、外接触控板走不同通道,不一定经过同一套系统手势门。Web 页在浏览器里还隔着一层浏览器自己的手势。应用若被授予完整屏幕独占(某些 kiosk、游戏模式),系统可能暂时让出边缘,但那是系统允许,不是应用拦截成功。这条讲“应用拦不住”,不讲如何申请豁免。

怎么落地

  • 把系统手势热区从应用的关键手势里划出去,或把应用手势改到不会与系统同形的区域。
  • 不要在 began 里写“如果是返回就取消系统”——那一分支根本不会跑到。
  • 从屏幕左缘滑:若系统返回了而应用日志没有 began,视为预期,去改布局而不是改拦截。

延伸

  • 同组C3.31.2 应用请求豁免系统手势需要显式声明,且用户可能不知情 · C3.31.3 系统与应用手势的优先级规则随系统版本变化,旧应用可能被新增系统手势打断 · C3.31.4 优先级冲突的默认解决方向应该是保留用户退出与导航的能力
  • 相邻C3.13 边缘滑入手势 · C3.16 上滑关闭与上滑回主屏
  • 站内检索system gesture · event preemption · window server

同组卡片

快捷操作

分享

分享当前页面

ios_share

https://hci.top/zh/handbook/C3.31.1