在应用程序DidBecomeActive 之后立即调用iOS 应用程序DidEnterBackground 时?

Posted

技术标签:

【中文标题】在应用程序DidBecomeActive 之后立即调用iOS 应用程序DidEnterBackground 时?【英文标题】:When in iOS applicationDidEnterBackground called immediately after applicationDidBecomeActive? 【发布时间】:2020-11-13 09:47:25 【问题描述】:

在我们的应用中,每次用户打开我们的应用时,我们都会记录(使用外部分析服务)。 但是,我们注意到有很多奇怪的应用会话(几乎占总会话的 15%)。

根据事件的设备时间戳,调用以下方法:

application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?)

applicationDidBecomeActive(_ application: UIApplication)

viewDidAppear(_ animated: Bool) // App Splash Screen

applicationDidEnterBackground(_ application: UIApplication)

查看时间戳,从 didFinishLaunchingWithOptions applicationDidEnterBackground 有一个非常短的延迟(

我们的假设是,系统有时会在用户未真正打开和“看到”应用程序的情况下唤醒应用程序。但是我们找不到任何关于这种用例的文档,我们也无法重现这个问题。 有没有人经历过类似的事情?

编辑: 我想补充一点,这些可疑会话通常(但不总是)与应用更新相关联。

【问题讨论】:

可能是用户对电话、计时器或警报横幅做出反应时。我只是在猜测,但也许当横幅被关闭时,应用程序“变得活跃”,但几乎立即该操作接管并且您的应用程序被发送到后台 这是可能的。然而,有太多的会议只是电话。此外,所有通话都应在应用启动和启动屏幕之间进行。 @EmilioPelaez 当用户收到通知时应用程序不会启动,这一切都在操作系统级别处理 - 除非推送通知有 content-available: 1 然后它也会用this callback 唤醒应用程序.但是通常您不会在带有警报的通知中发送该标志。因为该标志旨在使通知静音。更多信息请参见here 【参考方案1】:

我不确定...

我想如果应用程序没有被用户终止或暂停,而是因为其他应用程序需要内存而被内存不足,那么几乎一个启动选项可以在需要时唤醒应用程序。一些例子:

地理围栏 与推送通知操作的交互。例如,如果您实现了 userNotificationCenter(_:didReceive:withCompletionHandler:)... 静默通知 后台应用刷新

查看here,了解您的应用可以使用哪些启动选项。我不确定他们是否都可以真正启动应用程序或什么...

如果您希望对此有更多的了解,请确保您将来记录导致应用启动的启动选项键...

【讨论】:

我们从 plist 中完全删除了应用程序的后台功能,但问题仍然存在。我不知道第 3 方库是否可以覆盖该“设置”。 @user1305336 那很奇怪。我不认为第三方可以,我的意思是,他们可以请求它,但主应用程序在其 plist 中具有适当的键值对。【参考方案2】:

您需要更多信息 - 我会扩展您的日志记录以将 launchOptions 字典转储到

application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?)

查看UIApplication.LaunchOptionsKey,可能涉及很多选项。请注意,正如help 所说:在用户直接启动应用程序的情况下,此字典的内容可能为空

 if let lop = launchOptions  
   let toLog = lop.map"\($0.0.rawValue) \($0.1)".joined(separator:"\n")
   // log the options
...

我确实知道这可能与在 AppSwitcher 中进行预览有关,但这似乎不会触发 didFinishLaunchingWithOptions,除非您实际上将应用程序置于最前面。也许iPad上有一些分屏的东西?感觉就像是在无法通过启动屏幕的上下文中调用应用程序。

【讨论】:

以上是关于在应用程序DidBecomeActive 之后立即调用iOS 应用程序DidEnterBackground 时?的主要内容,如果未能解决你的问题,请参考以下文章

Spritekit - 在 didBecomeActive 时保持游戏暂停

应用程序中的调用函数didbecomeactive - Swift 2.0

SpriteKit - didBecomeActive 时不显示暂停屏幕

强制 App 导航到 App DidBecomeActive 中的特定视图

UISceneDelegate 和 UIApplicationDelegate 的“didBecomeActive”和“willResignActive”方法对之间的区别?

Errors/BindingResult 参数应在模型属性、@RequestBody 或 @RequestPart 参数之后立即声明