черный экран iOS при выводе приложения на передний план через некоторое время в фоновом режиме - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь удалить все раскадровки из нашего приложения для iOS, так как они сильно мешают при работе в команде с Git.

Сейчас я устанавливаю начальный ViewController в методе AppDelegate application(_:didFinishLaunchingWithOptions:):

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

    window = UIWindow(frame: UIScreen.main.bounds)
    let launchViewController = LaunchView()
    window!.rootViewController = launchViewController
    window!.makeKeyAndVisible()

    [...]

    return true
}

LaunchView - это простой контроллер представления, отвечающий за маршрутизацию пользователя для входа или основного экрана в зависимости от того, вошел ли он в систему.

До этого LaunchView был установлен как начальный в Main.storyboard.

Я уже удалил эти строки из файла Info.plist:

<key>UIMainStoryboardFile</key>
<string>Main</string>

Все работает нормально, за исключением случаев, когда мы оставляем приложение в фоновом режиме на пару часов без принудительного выходаэто (я не уверен, сколько времени нужно, чтобы воспроизвести это), а затем вернуть приложение на передний план, отображается полностью черный экран, как если бы корневой контроллер исчез.И мы должны убить приложение и открыть его снова, чтобы использовать его.

Это сводит меня с ума, потому что это действительно трудно воспроизвести, так как если вы оставите приложение в фоновом режиме только на несколько минут, оноработает отлично.Я подозреваю, что это как-то связано с приостановленным приложением, но я не совсем уверен.

Знаете ли вы, где может быть проблема?

Спасибо!

РЕДАКТИРОВАТЬ

Может быть, это как-то связано с проблемой: На LaunchView я отправляю пользователя на главный экран (если он вошел в систему) со следующимкод:

guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }

let rootVC = UIStoryboard.main.rootViewController
if let snapshot = appDelegate.window?.snapshotView(afterScreenUpdates: true) {

    rootVC.view.addSubview(snapshot);
    appDelegate.window?.rootViewController = rootVC

    UIView.transition(with: snapshot, duration: 0.4, options: .transitionCrossDissolve, animations: {
        snapshot.layer.opacity = 0;
    }, completion: { (status) in
        snapshot.removeFromSuperview()
    })
}
else {
    appDelegate.window?.rootViewController = rootVC
}

Возможно ли, что iOS в какой-то момент удаляет rootViewController?

1 Ответ

0 голосов
/ 15 марта 2019

Оказывается, проблема была связана с эффектом перехода, включающим моментальный снимок при замене window rootViewController.

Я удалил эффект перехода и просто изменил rootViewController.Теперь все работает нормально!

В коде я изменил это:

guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }

let rootVC = UIStoryboard.main.rootViewController
if let snapshot = appDelegate.window?.snapshotView(afterScreenUpdates: true) {

    rootVC.view.addSubview(snapshot);
    appDelegate.window?.rootViewController = rootVC

    UIView.transition(with: snapshot, duration: 0.4, options: .transitionCrossDissolve, animations: {
        snapshot.layer.opacity = 0;
    }, completion: { (status) in
        snapshot.removeFromSuperview()
    })
}
else {
    appDelegate.window?.rootViewController = rootVC
}

На это:

guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
let rootVC = UIStoryboard.main.rootViewController
appDelegate.window?.rootViewController = rootVC

Спасибо всем за помощь!Надеюсь, этот ответ пригодится кому-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...