iOS - Восстановление состояния приложения координаторами после завершения - PullRequest
1 голос
/ 28 февраля 2020


Система навигации в моем приложении содержит шаблон координатора. когда мое приложение запускается в первый раз, все работает хорошо. Но когда приложение уходит в фоновый режим и телефонная система завершает его, и я пытаюсь вернуться к нему, приложение запускается впервые. Поэтому мне нужно восстановить состояние моего приложения, если система завершает приложение в фоновом режиме.
Мой AppDelegate класс

import UIKit
import Swinject

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?
let container = Container()

private var appCoordinator: AppCoordinator!

func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
    setupDependecies()

    return true
}

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    window = UIWindow()
    appCoordinator = AppCoordinator(window: window!, container: container)
    appCoordinator.start()
    window?.makeKeyAndVisible()

    return true
}

func application(_ application: UIApplication, shouldSaveSecureApplicationState coder: NSCoder) -> Bool {
    return true
}

func application(_ application: UIApplication, shouldRestoreSecureApplicationState coder: NSCoder) -> Bool {
    return true
}
}


AppCoordinator класс

import Foundation
import UIKit
import Swinject

enum AppChildCoordinator {
case serial
case topic
}

final class AppCoordinator: Coordinator {

private let window: UIWindow
let container: Container
private var childCoordinators = [AppChildCoordinator: Coordinator]()
private let navigationController: UINavigationController
private let plistService: PlistService

init(window: UIWindow, container: Container) {
    self.window = window
    self.container = container
    navigationController = UINavigationController()
    self.window.rootViewController = navigationController
    plistService = container.resolve(PlistService.self)!
}

func start() {
    let isActivated: Bool?
    isActivated = plistService.readPlist(namePlist: "Preferences", key: Constans.isActivated) as! Bool?
    if isActivated != nil && isActivated! {
        showTopic()
    } else {
        showSerial()
    }
}

private func showSerial() {
    let serialCoordinator = SerialCoordinator(container: container, navigationController: navigationController)
    childCoordinators[.serial] = serialCoordinator
    serialCoordinator.delegate = self
    serialCoordinator.start()
}

private func showTopic() {
    let topicCoordinator = TopicCoordinator(container: container, navigationController: navigationController)
    childCoordinators[.topic] = topicCoordinator
    topicCoordinator.delegate = self
    topicCoordinator.start()
}
}

extension AppCoordinator: SerialCoordinatorDeligate {

func serialCoordinatorDidFinish() {
    childCoordinators[.serial] = nil
    showTopic()
}
}

extension AppCoordinator: TopicCoordinatorDeligate {

func topicCoordinatorDidFinish() {
    childCoordinators[.topic] = nil
}
}


Я понимаю, что когда мое приложение запускает его Serial или Topi c координатор без лога восстановления c. Например, если пользователь go до координатор Topi c, то до Auth координатор (дочерний элемент Topi c координатор), затем до Координатор * Home (дочерний элемент Auth * Координатор ), как я могу восстановить координатор Home после запуска, завершенного системным приложением?

...