Ios 应用程序在使用Xcode 11.3.1构建后打开时崩溃

Ios 应用程序在使用Xcode 11.3.1构建后打开时崩溃,ios,swift,iphone,xcode,ios13.3,Ios,Swift,Iphone,Xcode,Ios13.3,升级到Xcode 11.3.1后,我们注意到我们的应用程序在打开时在某些设备上开始崩溃。它发生在不同的iOS版本和iPhone型号上。然而,在一些具有相同iOS版本或iPhone型号的设备上,该应用程序运行良好 在这些设备上安装应用程序的早期版本(使用早期Xcode版本构建)时,不会发生崩溃 在调试过程中,我们发现在使用登录模块的演示者尝试打开一个可选时发生崩溃。此演示者在创建和分配时有一个值,但在AppDelegate窗口中设置了rootViewController之后。rootViewCon

升级到Xcode 11.3.1后,我们注意到我们的应用程序在打开时在某些设备上开始崩溃。它发生在不同的iOS版本和iPhone型号上。然而,在一些具有相同iOS版本或iPhone型号的设备上,该应用程序运行良好

在这些设备上安装应用程序的早期版本(使用早期Xcode版本构建)时,不会发生崩溃

在调试过程中,我们发现在使用登录模块的演示者尝试打开一个
可选
时发生崩溃。此演示者在创建和分配时有一个值,但在AppDelegate
窗口中设置了
rootViewController
之后。rootViewController=navigationController
执行跳转到下面显示的
viewDidLoad()
函数,此时演示者为
nil

class LoginViewController: LoginPasswordResetViewController {
    var presenter: LoginPresenterProtocol!

    override func viewDidLoad() {
        super.viewDidLoad()

        updateUI(model: presenter.loadViewModel())
        presenter.viewDidLoad()
    }
}
AppDelegate.swift中的相关代码:

class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?

func application(_: UIApplication, didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    let env = Environment()

    if let app = UIApplication.shared.delegate as? AppDelegate,
        let window = app.window,
        let loginVC = LoginModule().createModule(moduleData: LoginModuleData(env: env),
                                                 service: LoginService(env: env),
                                                 storageService: LocalStorageService(env: env)) {

        let navigationController = UINavigationController(rootViewController: loginVC)

        window.rootViewController = navigationController
        window.makeKeyAndVisible()
    }
    return true
}
我尝试使用这里提到的SceneDelegate.swift设置RootViewController,但没有成功

关于这个问题的原因有什么想法吗

其他信息:

import UIKit
@available(iOS 13.0, *)
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    var window: UIWindow?

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        let env = Environment()

        if let windowScene = scene as? UIWindowScene,
            let loginVC = LoginModule().createModule(moduleData: LoginModuleData(env: env),
                                                     service: LoginService(env: env),
                                                     storageService: LocalStorageService(env: env)) {
            self.window = UIWindow(windowScene: windowScene)
            self.window!.rootViewController = UINavigationController(rootViewController: loginVC)
            self.window!.makeKeyAndVisible()
        }
    }
}
import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    func application(_: UIApplication, didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        if #available(iOS 13.0, *) {} else {
            let env = Environment()

            if let app = UIApplication.shared.delegate as? AppDelegate,
                let window = app.window,
                let loginVC = LoginModule().createModule(moduleData: LoginModuleData(env: env),
                                                         service: LoginService(env: env),
                                                         storageService: LocalStorageService(env: env)) {
                window.rootViewController = UINavigationController(rootViewController: loginVC)
                window.makeKeyAndVisible()
            }
        }
        return true
    }
createModule
函数初始化并设置
presenter

func createModule(moduleData: LoginModuleDataProtocol, service: LoginServiceProtocol, storageService: LocalStorageServiceProtocol) -> LoginViewController? {
    guard let viewController: LoginViewController = UIStoryboard.viewController(from: self) else {
        return nil
    }
    let presenter = LoginPresenter()
    let interactor = LoginInteractor()
    let router = LoginRouter()

    // VC
    viewController.presenter = presenter
    // Presenter
    presenter.viewController = viewController
    presenter.interactor = interactor
    presenter.router = router
    // Interactor
    interactor.presenter = presenter
    interactor.dataManager = LoginDataManager(data: moduleData, service: service, storageService: storageService)
    // Router
    router.viewController = viewController

    return viewController
}

创建模块后,
loginVC
变量应具有
presenter
值,但只要我们分配
window.rootViewController=navigationController
presenter
的值为
nil

,我就设法使其工作。我不得不使用
SceneDelegate
加载组件来启动我的iOS 13应用程序,但我只是在阅读之后才设法让它工作

class LoginViewController: LoginPasswordResetViewController {
    var presenter: LoginPresenterProtocol!

    override func viewDidLoad() {
        super.viewDidLoad()

        updateUI(model: presenter.loadViewModel())
        presenter.viewDidLoad()
    }
}
以下是对我有效的结果:

SceneDelegate.swift:

import UIKit
@available(iOS 13.0, *)
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    var window: UIWindow?

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        let env = Environment()

        if let windowScene = scene as? UIWindowScene,
            let loginVC = LoginModule().createModule(moduleData: LoginModuleData(env: env),
                                                     service: LoginService(env: env),
                                                     storageService: LocalStorageService(env: env)) {
            self.window = UIWindow(windowScene: windowScene)
            self.window!.rootViewController = UINavigationController(rootViewController: loginVC)
            self.window!.makeKeyAndVisible()
        }
    }
}
import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    func application(_: UIApplication, didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        if #available(iOS 13.0, *) {} else {
            let env = Environment()

            if let app = UIApplication.shared.delegate as? AppDelegate,
                let window = app.window,
                let loginVC = LoginModule().createModule(moduleData: LoginModuleData(env: env),
                                                         service: LoginService(env: env),
                                                         storageService: LocalStorageService(env: env)) {
                window.rootViewController = UINavigationController(rootViewController: loginVC)
                window.makeKeyAndVisible()
            }
        }
        return true
    }
AppDelegate.swift:

import UIKit
@available(iOS 13.0, *)
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    var window: UIWindow?

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        let env = Environment()

        if let windowScene = scene as? UIWindowScene,
            let loginVC = LoginModule().createModule(moduleData: LoginModuleData(env: env),
                                                     service: LoginService(env: env),
                                                     storageService: LocalStorageService(env: env)) {
            self.window = UIWindow(windowScene: windowScene)
            self.window!.rootViewController = UINavigationController(rootViewController: loginVC)
            self.window!.makeKeyAndVisible()
        }
    }
}
import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    func application(_: UIApplication, didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        if #available(iOS 13.0, *) {} else {
            let env = Environment()

            if let app = UIApplication.shared.delegate as? AppDelegate,
                let window = app.window,
                let loginVC = LoginModule().createModule(moduleData: LoginModuleData(env: env),
                                                         service: LoginService(env: env),
                                                         storageService: LocalStorageService(env: env)) {
                window.rootViewController = UINavigationController(rootViewController: loginVC)
                window.makeKeyAndVisible()
            }
        }
        return true
    }

当它只在某些设备上崩溃时,可能是时间问题。
createModule
函数如何设置
loginVC
presenter
属性?您的presenter在哪里初始化?我添加了一些额外的信息@andreasetjen,调用
createModule
函数后,
loginVC
有一个有效的
presenter
。您的viewcontroller对presenter有强引用吗?@Manoj第一个代码位是
LoginViewController
类(忘记添加它),因此引用应该是强引用。