iPhone口袋状态传感器
Ian Whiffin 发布于:2025年6月29日
统一日志
统一日志是iOS设备的核心组件,能够在用户无感知的情况下持续捕获日志信息。通常,这些日志用于协助诊断问题和错误,因此日志内容极其详细但保存时间较短。
最近我在日志中发现了一个有趣的记录项,标记为"Doppler"。虽然我确信多普勒效应在这里可能有所涉及,但下文我将统一称其为"口袋状态传感器"。
接近传感器
iPhone多年来一直配备接近传感器 - 您可以在通话时通过将手机靠近/远离脸部来观察这一功能。但似乎在配备FaceID的设备上,这个传感器现在也被以不同方式使用。
您是否注意到,当您拿起iPhone并将其对准脸部时,它会自动解锁?这就是口袋状态/多普勒功能在起作用。
统一日志详情
统一日志中有"FrontIR: Doppler"的记录,并引用设备处于"口袋状态"或"口袋状态已清除"。这与安装在iPhone(X及更新机型)正面的红外摄像头有关,该摄像头用于面部扫描。
红外摄像头安装在"刘海"的左侧,通过某些相机可以看到其在操作时闪烁。需要注意的是,该摄像头不会持续扫描,只在特定情况下进行扫描。
测试过程
通过能够显示红外光的设备观察IR摄像头在不同刺激下的反应。(本质上,我使用Google Pixel相机来观察iPhone)
为说明目的,以下图像展示了IR摄像头的反应情况:
| 操作 | 设备状态 | 描述 |
|---|---|---|
| 休眠 | 无刺激 | 屏幕关闭,无IR活动 |
| 触摸屏幕 | 触摸侧边按钮,抬起唤醒 | 屏幕亮起,IR闪烁 |
| 来电 | 屏幕亮起 | IR闪烁 |
| 接收通知 | 屏幕亮起 | IR闪烁 |
| 休眠 | 覆盖IR | 屏幕关闭,未知IR活动 |
| 触摸屏幕 | 覆盖IR | 屏幕微亮,未知IR活动 |
测试事件的时间安排如下:
- 10:19:00 测试开始,IR摄像头未覆盖,设备休眠
- 10:20:00 IR摄像头被覆盖,设备其他部分未受干扰
- 10:21:00 点击屏幕,设备微亮10秒
- 10:22:00 点击屏幕,设备微亮10秒
- 10:22:30 按下侧边按钮,设备微亮10秒
- 10:23:00 向测试设备拨打电话
- 10:23:08 测试设备收到来电,响铃时屏幕微亮
- 10:23:40 屏幕进入休眠
- 10:25:00 向测试设备发送短信
- 10:25:05 收到短信 - 屏幕未亮起
- 10:27:05 再次收到短信通知
- 10:27:45 点击屏幕,设备微亮
- 10:27:50 移除覆盖物,屏幕完全亮起
- 10:29:00 向测试设备拨打电话
- 10:29:08 测试设备收到来电,响铃时屏幕微亮
- 10:29:15 移除覆盖物,屏幕完全亮起
- 10:29:20 重新覆盖 - 屏幕无变化
- 10:29:25 移除覆盖 - 屏幕无变化
- 10:29:30 屏幕进入休眠时重新覆盖
日志分析
统一日志在Mac上使用默认的日志存档查看器生成和查看。测试期间,共创建了1058条可按时间分组的记录:
10:21:00至10:21:10 创建150条记录,每条显示:“FrontIR: Doppler in pocket state detected”,可理解为"前置摄像头被遮挡"。这些时间与屏幕被触摸后10秒的屏幕亮起时间一致。
10:22:01至10:21:11 创建150条记录,每条显示:“FrontIR: Doppler in pocket state detected”。这些时间与屏幕被触摸后10秒的屏幕亮起时间一致。
10:22:30至10:22:40 创建150条记录,每条显示:“FrontIR: Doppler in pocket state detected”。这些时间与侧边按钮被按下后10秒的屏幕亮起时间一致。
10:23:08至10:23:39 创建406条记录,每条显示:“FrontIR: Doppler in pocket state detected”。这些时间与收到来电时屏幕亮起以及呼叫未接听后的屏幕变暗时间一致。
10:27:45至10:27:50 创建89条记录。前88条记录显示:“FrontIR: Doppler in pocket state detected”。最后一条记录显示:“FrontIR: Doppler in pocket state cleared”。这些时间与屏幕被触摸时屏幕亮起以及覆盖物被移除的时间一致。
10:29:08至10:29:15 创建113条记录。前112条记录显示:“FrontIR: Doppler in pocket state detected”。最后一条记录显示:“FrontIR: Doppler in pocket state cleared”。这些时间与屏幕被触摸时屏幕亮起以及首次移除覆盖物的时间一致。重新覆盖没有影响。
抬起唤醒功能
导致背光亮起和Doppler功能触发的iOS功能之一是"抬起唤醒"功能,该功能检测用户何时拿起设备。
此功能记录可在com.apple.springboard.plist中找到,位于private\var\mobile\Library\Preferences。特定节点称为SBSupportLiftToWake,值为True或False。
通过旋转、掉落和拿起锁定状态的设备,同时观察背光是否激活,对抬起唤醒和一般运动进行了测试。测试过程参考了下图中描述的X、Y和Z轴:
测试结果如下:
| 运动类型 | 结果 |
|---|---|
| Z轴运动 | 设备垂直向上或向下运动(Z轴),包括从高处掉落,通常不会导致背光亮起 |
| XY平面运动 | 设备在X或Y平面上运动通常不会导致背光亮起 |
| X轴旋转 | 设备在X轴上旋转(从左到右或从右到左)通常不会导致背光亮起 |
| Y轴旋转 | 设备在Y轴上旋转(向前倾斜)会导致背光亮起。设备在Y轴上旋转(向后倾斜)通常不会导致背光亮起 |
如上表所示,唯一可靠导致背光亮起和Doppler功能触发的动作是设备在Y轴上向前倾斜用户的旋转运动。
总结
当iOS认为用户可能尝试解锁设备时,就会调用FrontIR Doppler功能。这由设备屏幕被触摸、侧边按钮被按下、抬起唤醒或接到来电触发。虽然来自传入短信的通知触发了IR光闪烁,但没有记录写入日志。
从测试来看,这似乎是一个可靠的记录。即当记录存在时,它似乎是显示设备IR摄像头是否被遮挡的可靠方法。