はじめに
アプリインストール後 初めてアプリを開いた場合はサインアップ画面に遷移し、
2回目以降はログイン画面に遷移するような実装をつくりました。
調べた中でUserDefaultsを使うのが一番簡単そうだったので紹介します。
UserDefaultsとは
アプリ起動時にキーと値のペアを自動的に保存してくれる便利な機能。
(アプリを削除するとUserDefaults内のデータも全て消えるため、重要なデータをUserDefaultsのみに持たせるべきではない。
Token等のセキュアな情報はKeychainAccessを使う。)
キーに値を設定する方法
UserDefaults.standard.set(保存したい値, forKey: キー)
値を取得する方法
UserDefaults.standard.bool(forKey: キー)
キーに対応する値が無い場合は、falseが返る。
他にもstringやarrayなど様々パターンがあるが、今回は起動したことがあるか否かの2パターンのためboolを使う。
実装
※前提
ログイン画面のStoryboard名は「Login.Storyboard」、Storyboard IDは「LoginViewController」
サインアップ画面のStoryboard名は「SignUp.Storyboard」、Storyboard IDは「SignUpViewController」と設定しております。
方針
【初めて起動したときの流れ】
①UserDefaults.standard.bool(forKey: "起動履歴あり") でfalseが返る(値が存在していないから)
②サインアップ画面に遷移させる
③UserDefaults.standard.set(true, forKey: "起動履歴あり")で次回以降はtrueを返すように設定する
【2回目以降に起動したときの流れ】
①UserDefaults.standard.bool(forKey: "起動履歴あり") 判定でtrueが返る
②ログイン画面に遷移させる
コード
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let _ = (scene as? UIWindowScene) else { return }
// ここから起動チェック
if UserDefaults.standard.bool(forKey: "起動履歴あり") {
// 初期画面をログイン画面にする
self.window?.rootViewController = createNavigationController(storyboardName: "Login", storyboardId: "LoginViewController")
} else {
// 初期画面をサインアップ画面にする
self.window?.rootViewController = createNavigationController(storyboardName: "SignUp", storyboardId: "SignUpViewController")
UserDefaults.standard.set(true, forKey: "起動履歴あり") // 一度起動したので値をtrueに設定する
}
self.window?.makeKeyAndVisible()
}
// 画面遷移のメソッド
func createNavigationController(storyboardName: String, storyboardId: String) -> UINavigationController {
let storyboard = UIStoryboard(name: storyboardName, bundle: nil)
let viewController = storyboard.instantiateViewController(withIdentifier: storyboardId)
let navigationController = UINavigationController()
navigationController.viewControllers = [viewController]
return navigationController
}
}
最後に
UserDefaultsは準備不要でいきなり使えるからかなり手軽で便利でした。
もっとスマートに書く方法があったら教えて下さい。
参考URL
https://qiita.com/uhooi/items/429cac9b798b9c0937ae#%E8%BF%BD%E5%8A%A0%E6%9B%B4%E6%96%B0
ありがとうございました!