我在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)")
}
}