Mac Catalyst 应用程序如何处理生命周期转换?

Posted

技术标签:

【中文标题】Mac Catalyst 应用程序如何处理生命周期转换?【英文标题】:How do Mac Catalyst apps handle lifecycle transitions? 【发布时间】:2020-05-14 10:32:25 【问题描述】:

它只是我的应用程序,还是所有使用 Catalyst 制作的 Mac 应用程序都不会经历生命周期变化,除非在启动或退出时?

在启动时,会调用 UIWindowSceneDelegate 方法 sceneWillEnterForeground:sceneDidBecomeActive:。退出时调用sceneWillResignActivesceneDidEnterBackground

但是,当应用程序保持打开状态并且我更改为新应用程序,或者让我的计算机进入睡眠状态,或者执行我希望强制应用程序进入后台状态的其他正常人类使用模式时,这些永远不会发生。我留下的印象是,只要用户不退出应用程序,它就永远不会离开前台状态。这是正确的吗?

如果我实现了对自动或突然终止的支持(详见here),应用程序是否会更频繁地进入/退出应用程序状态?

我有什么误解吗?

感谢您的帮助。

(注意:我构建了一个记录应用程序转换的系统——而不是“场景”转换——以便能够在不在 Xcode 中运行应用程序的情况下进行测试。)

【问题讨论】:

理论上sceneDidBecomeActive/sceneWillResignActive 必须有效,所以请向 Apple 提交反馈。 【参考方案1】:

就我而言,一种解决方法有所帮助:

#if targetEnvironment(macCatalyst)
   nc.addObserver(self, selector: #selector(hold), name: NSNotification.Name("NSApplicationDidResignActiveNotification"),object: nil)
   nc.addObserver(self, selector: #selector(resume), name: NSNotification.Name("NSApplicationDidBecomeActiveNotification"),object: nil)
#endif

希望将来会有更优雅的选择使用 UIScene。

【讨论】:

我这样做了,我把它放到了 sceneDidBecomeActive 的 SceneDelegate.swift 中,效果很好【参考方案2】:

我的情况很典型:使用 Catalyst 制作的 Mac 应用程序不像在 ios 上那样频繁地转换生命周期阶段。

来自this article:

然而,状态变化对 Mac 的影响较小,在 macOS 上几乎总是 Foreground + Active。 应用程序仅在终止期间进入后台,在后台启动时处于非活动状态。 您的应用仍应考虑 App Napp

【讨论】:

我对 mac Catalyst 也有一个奇怪的行为。在我运行我的应用程序后,一切正常(这是一个 VoiP 应用程序)。我可以发送通知、接听电话等。在我打开其他几个应用程序(并将我的应用程序发送到后台)后,什么也没有发生(我添加了一个无限日志,甚至它没有被写入),就像应用程序被冻结了一样。当我将焦点重新放在应用程序上时,一切正常(并且日志也被写入)。我检查了“App Napp”,但它已关闭。还有什么我可以尝试的吗? 在使用活动管理器并将其设置为“全屏”时,我还注意到一件事。我的应用程序的 CPU 占用率降至 0.0%,此时我没有收到任何通知。当我只关注活动管理器(但不最大化它)并且我的应用程序被最小化时,我得到 0.5% 的 CPU 并且应用程序按预期工作

以上是关于Mac Catalyst 应用程序如何处理生命周期转换?的主要内容,如果未能解决你的问题,请参考以下文章

如何修复“读写数据沙箱:使用 Mac Catalyst 时出错”

如何在 Mac Catalyst 应用程序中禁用默认键盘导航?

如何更改 Mac Catalyst 窗口场景中的窗口标题?

Mac Catalyst - 保存文件的标准对话框

如何为使用 Mac Catalyst 移植到 Mac 的 iPad 应用程序设置“帮助”菜单选项?

如何使用 Flutter 处理应用程序生命周期(在 Android 和 iOS 上)?