You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 12:45:36