代码之家  ›  专栏  ›  技术社区  ›  mmatiush

Swift iOS应用程序中场景委托方法调用的顺序出乎意料

  •  0
  • mmatiush  · 技术社区  · 3 年前

    我在Swift iOS应用程序中遇到了一系列不寻常的场景委托方法调用。具体来说,在sceneIdEnterBackground之前调用sceneWillEnterForeground,但使用不同的UIWindowScene实例。

    具体情况如下:

    其他应用程序在iOS中以最小化状态打开并可见。 我迅速最小化我的应用程序,并立即终止它(向上滑动即可终止)。 在这种情况下,我观察到以下调试打印序列:

    // app launch
    sceneWillEnterForeground <UIWindowScene: 0x10270b110>...
    sceneDidBecomeActive <UIWindowScene: 0x10270b110>...
    // app termination
    sceneWillResignActive <UIWindowScene: 0x10270b110>...
    sceneDidDisconnect <UIWindowScene: 0x10270b110>...
    sceneWillEnterForeground <UIWindowScene: 0x103e06510>...
    sceneDidEnterBackground <UIWindowScene: 0x103e06510>...
    

    请注意,sceneWillEnterForeground是在sceneIdEnterBackground之前调用的,但具有不同的UIWindowScene内存地址。

    然而,如果我在最小化状态下杀死应用程序,而其他应用程序不可见,或者如果我做得很慢,我会观察到没有附加场景的标准调用序列WillEnterForeground:

    // app launch
    sceneWillEnterForeground <UIWindowScene: 0x106007560>...
    sceneDidBecomeActive <UIWindowScene: 0x106007560>...
    // app termination
    sceneWillResignActive <UIWindowScene: 0x106007560>...
    sceneDidDisconnect <UIWindowScene: 0x106007560>...
    

    为什么在第一个场景中,在上一个UIWindowScene内存地址的sceneIdEnterBackground之前调用具有新UIWindowScenememory地址的scene WillEnterForeground?这是标准行为吗?委托方法的顺序是否会因系统行为而异?在这种情况下是否会创建新的UIWindowScene实例?

    如对此有任何见解,我们将不胜感激。

    请注意,如果我们使用AppDegate,我们可能会遇到与在applicationDidEnterBackground之前调用applicationWillEnterForeground相同的行为。

    这里有一个SceneDelegate代码,您可以快速复制它。

    import UIKit
    
    class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    
        var window: UIWindow?
    
        func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
            guard let _ = (scene as? UIWindowScene) else { return }
        }
    
        func sceneDidDisconnect(_ scene: UIScene) {
            print("sceneDidDisconnect \(scene)")
        }
    
        func sceneDidBecomeActive(_ scene: UIScene) {
            print("sceneDidBecomeActive \(scene)")
        }
    
        func sceneWillResignActive(_ scene: UIScene) {
            print("sceneWillResignActive \(scene)")
        }
    
        func sceneWillEnterForeground(_ scene: UIScene) {
            print("sceneWillEnterForeground \(scene)")
        }
    
        func sceneDidEnterBackground(_ scene: UIScene) {
            print("sceneDidEnterBackground \(scene)")
        }
    }
    
    0 回复  |  直到 3 年前