为啥我的 UIApplicationDelegate 在下拉通知中心时收到 applicationDidBecomeActive?

Posted

技术标签:

【中文标题】为啥我的 UIApplicationDelegate 在下拉通知中心时收到 applicationDidBecomeActive?【英文标题】:Why does my UIApplicationDelegate receive applicationDidBecomeActive when pulling down notification center?为什么我的 UIApplicationDelegate 在下拉通知中心时收到 applicationDidBecomeActive? 【发布时间】:2018-01-03 10:32:22 【问题描述】:

我在 XCode 中构建了一个没有任何功能的裸应用程序,并将日志记录语句放在 applicationDidBecomeActive 和 applicationWillResignActive 方法中。

当我向下滑动以显示通知中心时,我看到以下内容:

2018-01-03 10:18:16.867028+0000 BareProject[1165:2053601] 主动辞职

2018-01-03 10:18:17.510713+0000 BareProject[1165:2053601] 活动

2018-01-03 10:18:17.634805+0000 BareProject[1165:2053601] 主动辞职

这是故意的吗?我的代码在激活时做了很多工作,只是在大约 120 毫秒后再次将地毯从其中拉出,似乎文档说我应该使用 applicationDidBecomeActive 来重新启动任务: https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1622956-applicationdidbecomeactive?language=objc

我在 ios 10.3 上试过这个,这个行为不存在。

【问题讨论】:

这种行为在 iOS 12 中仍然存在。这太可怕了。 有趣的是,当 iPhone 自己锁定时,这个问题也存在。首先applicationDidBecomeActive 然后立即applicationWillResignActive 对我上面的评论:当通知中心已经完全覆盖屏幕时会发生这种情况。这是一个巨大的错误 IMO。 iOS15还是有这个问题 【参考方案1】:

实际上有两个问题,对applicationDidBecomeActive: 的意外调用和对applicationWillResignActive: 的重复调用。

“下拉”显示在iOS 9上正常工作的通知中心。之前系统只调用了applicationWillResignActive:,刚刚用iOS 9模拟器验证过。

在 iOS 11.2.6 上,applicationDidBecomeActive: 会按照您的描述被调用,这似乎是一个 Apple 错误。在这种特殊情况下,系统行为与文档冲突。这是另一个文档偏离您观察到的行为的示例https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/StrategiesforHandlingAppStateTransitions/StrategiesforHandlingAppStateTransitions.html#//apple_ref/doc/uid/TP40007072-CH8-SW10

当您的应用移回活动状态时,其 applicationDidBecomeActive:方法应该反转任何步骤 在 applicationWillResignActive: 方法中获取。

【讨论】:

【参考方案2】:

看起来这是一个错误,使其成为常规行为

你需要寻找applicationDidEnterBackground

但是,如果您需要为此处理代码 当通知中心向下滑动时,您可以使用以下命令在 applicationDidBecomeActive 中不运行代码

class AppDelegate: UIResponder, UIApplicationDelegate 
    
    var didEnterBackground = true
    
    func applicationDidBecomeActive(_ application: UIApplication) 
       if !didEnterBackground 
           return
       
       didEnterBackground = false

       // run your code       
    
    
    func applicationDidEnterBackground(_ application: UIApplication) 
        didEnterBackground = true
    
    

【讨论】:

以上是关于为啥我的 UIApplicationDelegate 在下拉通知中心时收到 applicationDidBecomeActive?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以将 AppDelegate 添加到独立的 watchOS SwiftUI 应用程序中?

为啥我的 Chrome Profiler 没有为我的对象显示正确的保留路径,为啥我的对象从未被释放?

为啥我的程序需要两行输入,为啥我的 GPA 计算错误 c#?

为啥我的 PHP 会话会死掉?为啥我不能恢复它们?

为啥我的碰撞测试总是返回“真”,为啥图像矩形的位置总是错误的 (0, 0)?

NPM 启动错误上的 ENOENT。为啥我会收到此错误,为啥要查找“我的图片”目录?