【问题标题】:Can I use `willConnectTo` as `didFinishLaunching` for single window app in iOS?我可以将`willConnectTo`用作iOS中单窗口应用程序的`didFinishLaunching`吗?
【发布时间】:2021-03-21 04:06:51
【问题描述】:

我的应用程序只有一个窗口。将willConnectTo 用作didFinishLaunching 并将sceneDidDisconnect 用作假设的didTerminateApp 是否安全?

我不希望我的旧 AppDelegate 逻辑拆分为 2 个文件。所以我想要这个设置主要是为了方便。

我在场景委托的sceneDidDisconnect 函数中阅读了评论:

这发生在场景进入后台后不久,或者它的会话被丢弃时。

但是,当我尝试时,情况并非如此 - 在我的应用程序后台运行后它永远不会被调用。我的猜测是这只适用于多窗口的情况。

脚注:我了解对于多窗口应用(在 iPad 上),场景生命周期 != 应用生命周期。我已经阅读了大约 3-4 篇关于新 SceneDelegate 的在线教程。我只是要求单窗口情况。

【问题讨论】:

  • 这是非常广泛的,相当模糊和漫无边际。它似乎做了很多错误的假设。你能指定一个具体的问题你想问吗?
  • @matt 仅 1 个问题:我可以像使用 didFinishLaunching 一样使用 willConnectTo
  • 但这毫无意义。它们是不同的,它们都在启动时被调用。每个人都有自己的工作要做。
  • @matt 你是说即使在单窗口应用程序中,我也不能像didFinishLaunching 一样使用willConnectTo?您能否提供更多理由(而不仅仅是“他们不同”)
  • 我不知道你说的“好像”是什么意思,你也没有解释。当然,大多数 工作都是从一个转移到另一个,例如构建视图层次结构和发现传入的 URL 等。但是应用程序初始化仍然是 didFinishLaunching 的工作。他们每个人都有工作要做。我怀疑在大多数应用程序中,didFinishLaunching 将做的很少。但它仍然存在。

标签: ios uikit


【解决方案1】:

在您的情况下,您可能会将willConnectTo 视为didFinishLaunching(基于您描述的当前行为)。但如果苹果改变了这种行为,我不会感到惊讶。

这是一种更“面向未来”的方法:

既然你的应用只支持单场景,为什么不让AppDelegate成为SceneDelegate的代表呢?换句话说,将SceneDelegate 的生命周期事件中继到AppDelegate

半伪代码:

// SceneDelegate

func didEnterForground() {
  // AppDelegate must be present before SceneDelegate
  UIApplication.shared.didEnterForground()
}

// AppDelegate

// This is pretty much the old-style AppDelegate that contains all your logic
func didFinsihLaunching() {
}
func didEnterForground() {  
}

现在不是将所有逻辑都移到 SceneDelegate 中,而是将它们保存在 AppDelegate 中!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    相关资源
    最近更新 更多