iOS - Restore app state by coordinators after terminate

319 views Asked by At


Navigation system in my app contains coordinator pattern. when my application starts for the first time, everything works well. But when the app recedes into the background and phone system terminate it and I'm trying to get back to it, app starts for the first time again. So I need to restore my app state if system terminate app in background.
My AppDelegate class

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 class

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


I understand that when my app starts it run Serial or Topic coordinator without restore logic. For example if user go to Topic coordinator, then to Auth coordinator (child of Topic coordinator), then to Home coordinator (child of Auth coordinator), how can I restore Home coordinator after start terminated by system app?

0

There are 0 answers