我可以将`willConnectTo`用作iOS中单窗口应用程序的`didFinishLaunching`吗?

Posted

技术标签:

【中文标题】我可以将`willConnectTo`用作iOS中单窗口应用程序的`didFinishLaunching`吗?【英文标题】:Can I use `willConnectTo` as `didFinishLaunching` for single window app in iOS? 【发布时间】: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 将做的很少。但它仍然存在。 【参考方案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 中!

【讨论】:

以上是关于我可以将`willConnectTo`用作iOS中单窗口应用程序的`didFinishLaunching`吗?的主要内容,如果未能解决你的问题,请参考以下文章

iOS swiftDelegate 文件在添加代码时出现黑屏,请指导

Xcode iOS Simulator:我可以将鼠标用作假装 Apple Pencil 输入(在 iPad Pro 上)进行测试吗?

如何将 iPhone 用作 OS X、iOS 或 tvOS 的游戏控制器 [关闭]

IOS:如何将 UITableView 用作 Facebook 类应用程序的 Newsfeed 视图

如何将多个 .xib 重新用作另一个 .xib 的模板?

iOS7 Sprite Kit 我可以存档整个场景并将其用作保存游戏吗?