当用户在 iOS 设备上向下滑动通知中心屏幕时,UIApplication.didBecomeActiveNotification 被意外调用一次

问题描述 投票:0回答:3

就像标题所说,我在 iOS 11 和 12 中发现了这种意外的行为。
有谁知道为什么调用此事件,更重要的是,是否有任何解决方法可以防止系统触发此

UIApplication.didBecomeActiveNotification
事件?

以下是重现此行为的步骤:

  1. 运行应用程序。
  2. 访问 iPhone 或 iPad 上的通知中心屏幕(通过从设备屏幕的最顶部向下滑动)。
  3. 当通知中心屏幕到达设备屏幕底部时,会触发
    UIApplication.didBecomeActiveNotification
    事件。

您可以简单地在 AppDelegate.swift 文件中添加日志进行测试,例如:

func applicationDidBecomeActive(_ application: UIApplication) {
        print("applicationDidBecomeActive")
}

我称其为意外,因为当通知中心屏幕出现时,应用程序实际上应该转向(至少是半)后台模式,并且不会返回到前台模式,除非通知中心屏幕消失(例如,通过向上滑动到屏幕的最上方)。
我还观察到,当控制中心屏幕显示时,该事件没有被触发。

在我的应用程序中,我尝试在应用程序进入后台(或半后台)时控制视频播放器的状态。意外的

.didBecomeActiveNotification
事件会扰乱状态控制工作流程。

我在Open Radar和这里搜索并用谷歌搜索了一段时间,没有出现这样的相关主题。

如有任何建议,我们将不胜感激。谢谢你。

ios swift nsnotificationcenter
3个回答
3
投票

我也有同样的问题。我有一个解决方法,但你无法阻止额外的

applicationDidBecomeActive
。至少我找不到。所以基本上我发现的是,在
applicationDidBecomeActive
被调用后几毫秒,
applicationWillResignActive
也被调用。因此,如果代码在几毫秒后执行并不重要,这就是我正在做的事情:

    private var firstDidBecomeActive = true
    private var appDidBecomeActiveWorkItem: DispatchWorkItem?

    func applicationDidBecomeActive(_ application: UIApplication) {
        //Skip first time, because that is start of the app
        if self.firstDidBecomeActive {
            self.firstDidBecomeActive = false
            return
        }

        self.appDidBecomeActiveWorkItem = DispatchWorkItem {
            //Do what you want here
        }

        //Make sure there is a small delay because when user opens notification center, it becomes active again and then after a few milliseconds resigns active
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.02, execute: self.appDidBecomeActiveWorkItem!)
    }
    
    func applicationWillResignActive(_ application: UIApplication) {
        self.appDidBecomeActiveWorkItem?.cancel()
        self.appDidBecomeActiveWorkItem = nil
    }

0
投票

func applicationWillResignActive(_ application: UIApplication) 可以用来代替 .didBecomeActiveNotification,以便在应用程序进入后台或半后台状态时收到通知。

在 iPhone 或 iPad 上访问通知中心屏幕(通过从设备屏幕最顶部向下滑动)会调用 applicationWillResignActive,如果我们向上滑动通知中心,则不会触发该应用程序。


0
投票

当启动您的应用程序或从另一个应用程序切换(例如系统设置)时,将调用方法

willEnterForeground
Notification
,允许我们标记并区分差异。

private var willResign = false

@objc func appDidBecomeActive(_ notify: Notification) {
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
        if self.willResign == true {
            return
        }
        // Your business...
    }
}

@objc func appWillResignActive(_ notify: Notification) {
    willResign = true
}
@objc func appWillEnterForeground(_ notify: Notification) {
    willResign = false
}
© www.soinside.com 2019 - 2024. All rights reserved.