首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当用户在UIApplication.didBecomeActiveNotification设备上单击Notification屏幕时,会意外地一次调用iOS

当用户在UIApplication.didBecomeActiveNotification设备上单击Notification屏幕时,会意外地一次调用iOS
EN

Stack Overflow用户
提问于 2019-05-20 06:55:36
回答 2查看 1.7K关注 0票数 8

正如标题所示,我在iOS 11 & 12中发现了这种意想不到的行为。

有人知道为什么要调用这个事件吗,更重要的是,,有什么办法可以防止系统触发这个UIApplication.didBecomeActiveNotification事件吗?

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

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

您只需在AppDelegate.swift文件中添加一个日志以进行测试,如下所示:

代码语言:javascript
运行
复制
func applicationDidBecomeActive(_ application: UIApplication) {
        print("applicationDidBecomeActive")
}

我认为这是意外的,因为当Notification屏幕出现时,应用程序实际上应该转向(至少半)背景模式,而不是回到前台模式,除非Notification屏幕消失(例如,滑动到屏幕的最上面)。

我还注意到,当Control屏幕出现时,事件没有被触发。

在我的应用程序中,当应用程序转到后台(或半背景)时,我尝试控制视频播放器的状态。意外的.didBecomeActiveNotification事件惹恼了状态控制工作流。

我搜索了开放雷达和这里,搜索了一段时间,没有出现这样的相关话题。

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

EN

回答 2

Stack Overflow用户

发布于 2022-03-23 09:25:06

我也有同样的问题。我有一个解决办法,但您不能阻止额外的applicationDidBecomeActive。至少我找不到。基本上,我发现在applicationDidBecomeActive被调用后几毫秒,applicationWillResignActive也被调用。因此,如果代码在几毫秒后被执行并不重要,我就是这样做的:

代码语言:javascript
运行
复制
    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
    }
票数 2
EN

Stack Overflow用户

发布于 2019-05-20 09:33:03

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

访问iPhone或iPad上的Notification屏幕(从设备屏幕的顶部向下滑动)将调用applicationWillResignActive,如果我们滑动通知中心,它不会被触发。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56215679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档