Приложение вылетает при открытии после сборки с Xcode 11.3.1 - PullRequest
0 голосов
/ 18 февраля 2020

После обновления до Xcode 11.3.1 мы заметили, что наше приложение начало открывать sh на некоторых устройствах. Это происходит на разных iOS версиях и iPhone моделях. Однако на некоторых устройствах с той же версией iOS или iPhone приложение работает нормально.

При установке более ранней сборки приложения на эти устройства (которая была собрана с более ранней версией Xcode) sh не происходит.

Во время отладки мы обнаружили, что cra sh возникает при попытке развернуть Optional при использовании ведущего нашего модуля входа в систему. Этот презентатор имеет значение при создании и назначается, но после установки нашего rootViewController в AppDelegate window.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 iOS 13 , чтобы установить RootViewController без удачи.

Любые идеи о том, что может быть причиной этой проблемы?

Дополнительная информация:

Функция 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.

1 Ответ

0 голосов
/ 25 февраля 2020

Мне удалось заставить его работать. Мне пришлось использовать SceneDelegate для загрузки компонентов, чтобы запустить мое приложение для iOS 13, в то время как все еще поддерживает iOS 12 , но мне удалось заставить его работать только после прочтения , как настроить это правильно .

Итак, вот результат, который работал для меня:

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()
        }
    }
}

AppDelegate.swift:

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
    }
...