带Face ID系统授权弹窗的App,锁定解锁后未触发applicationDidBecomeActive
针对Face ID弹窗场景的App激活逻辑调整方案
当系统Face ID授权弹窗存在时,iOS会阻塞App的applicationDidBecomeActive回调,必须等用户处理完弹窗才会触发,这是系统级行为无法直接修改。要实现解锁设备时立即执行激活逻辑,可通过以下方式处理:
核心思路
- 监听设备解锁的底层状态:利用
UIApplicationProtectedDataDidBecomeAvailable通知,该通知会在设备解锁、App可访问受保护数据时立即触发,不受Face ID弹窗的阻塞。 - 拆分激活逻辑:将需要在解锁后立即执行的代码,从
applicationDidBecomeActive中剥离,放到该通知的回调里执行。 - 避免重复执行:在
applicationDidBecomeActive中添加判断,防止解锁通知和激活回调的逻辑重复执行。
代码示例(Swift)
private var hasExecutedUnlockedLogic = false // 在AppDelegate/SceneDelegate的初始化方法中注册通知 override init() { super.init() NotificationCenter.default.addObserver( self, selector: #selector(handleDeviceUnlocked), name: UIApplication.protectedDataDidBecomeAvailableNotification, object: nil ) } @objc private func handleDeviceUnlocked() { // 执行解锁后需要立即触发的逻辑 setupAppAfterUnlock() hasExecutedUnlockedLogic = true } func applicationDidBecomeActive(_ application: UIApplication) { guard !hasExecutedUnlockedLogic else { hasExecutedUnlockedLogic = false return } // 处理正常激活场景的逻辑 setupAppAfterActive() } // 解锁后立即执行的逻辑 private func setupAppAfterUnlock() { print("设备已解锁,执行即时激活操作") // 例如刷新界面、恢复后台任务等 } // 正常激活时的逻辑 private func setupAppAfterActive() { print("App进入活跃状态,执行常规激活操作") }
说明
UIApplicationProtectedDataDidBecomeAvailable通知是iOS提供的用于感知设备解锁状态的可靠方式,不受系统模态弹窗(包括Face ID授权弹窗)的影响。通过这种方式,能在设备解锁瞬间触发你需要的逻辑,无需等待用户处理完Face ID弹窗。
内容的提问来源于stack exchange,提问作者Tony wilson jesuraj
相关产品推荐
相关产品推荐

