如何在XCUITest(Swift)中验证屏幕未处于活跃状态?
判断iOS屏幕活跃状态的正确方法
首先要明确:UIApplication.shared.isIdleTimerDisabled不是用来判断屏幕当前状态的——这个属性的作用是控制系统是否自动锁屏,设置为true会禁止系统自动变暗/锁屏,设置为false则允许系统默认的锁屏逻辑。它的返回值只反映你是否主动修改过这个设置,和屏幕当前是亮屏还是黑屏没有关系,所以你看到它始终返回false是正常现象。
下面是两种可靠的屏幕状态判断方案:
方案一:通过屏幕亮度直接判断
屏幕黑屏时系统会将亮度自动设为0,亮屏时亮度大于0(用户手动调至0的极端情况极少),可以直接通过这个值判断:
func isScreenActive() -> Bool { return UIScreen.main.brightness > 0.0 }
优点:实现简单,无需监听通知;缺点:无法区分用户手动调暗至0和系统黑屏的情况,不过实际场景中这种误判概率极低。
方案二:监听系统通知维护状态(更全面)
结合屏幕亮度变化通知、接近传感器状态通知,维护一个实时更新的状态变量,覆盖更多场景(比如通话时贴近耳朵触发的黑屏):
class ScreenStateTracker { static var isScreenActive = true static func startTracking() { // 启用接近传感器监听 UIDevice.current.isProximityMonitoringEnabled = true // 监听亮度变化 NotificationCenter.default.addObserver( forName: UIScreen.brightnessDidChangeNotification, object: nil, queue: .main ) { _ in updateScreenState() } // 监听接近传感器状态变化 NotificationCenter.default.addObserver( forName: UIDevice.proximityStateDidChangeNotification, object: nil, queue: .main ) { _ in updateScreenState() } // 初始化初始状态 updateScreenState() } private static func updateScreenState() { // 接近传感器触发时(比如通话贴耳),屏幕会黑屏 let proximityBlackedOut = UIDevice.current.proximityState // 屏幕亮度大于0表示亮屏 let brightnessOn = UIScreen.main.brightness > 0.0 isScreenActive = brightnessOn && !proximityBlackedOut } }
使用方式:在App启动时调用ScreenStateTracker.startTracking(),之后随时通过ScreenStateTracker.isScreenActive获取当前屏幕状态。
注意事项
- 接近传感器需要主动启用,若不需要监听通话场景的黑屏,可以去掉相关逻辑;
- 当应用进入后台时,部分通知可能无法及时触发,此时可以结合
UIApplication.shared.applicationState辅助判断,但核心仍以屏幕亮度和传感器状态为准。
内容的提问来源于stack exchange,提问作者Indrajit
相关产品推荐
相关产品推荐

