【Swift】UserDefaultsでログイン機能 - 簡易版
難しい機能を使わず、UserDefaultsで簡単にログイン機能を実装します。
ソースコード
初回ログイン時
//StoryBoardに設置したUIButton @IBAction func login(_ sender: Any) { //もしtextFieldに文字が入力されてるなら if textField.text != "" { let ud = UserDefaults.standard //ユーザー名をUDに保存 ud.set(textField.text, forKey: "userName") //次の画面に遷移するなど performSegue(withIdentifier: "goTimeLine", sender: nil) //もしtextFieldに何も入力されてなければ } else { //アラート let alert = EMAlertController(title: "ユーザー名を入力してください", message: "") //アクション let action = EMAlertAction(title: "OK", style: .cancel) //アラートにアクションを追加する alert.addAction(action: action) //アラートを表示 present(alert, animated: true, completion: nil) } }
UIButtonを設置し、”userName”キーとして保存してます。
何も入力してない時のアラートをEMAlertControllerで実装しました。
UIAlertActionの方だと、アラートを生成するコードが長く、コードを短くしてシンプルにまとめたほうが見栄えが綺麗になるので、EMの方を採用しました。
EMControllerをimportして、たった4行で実装できるのはめっちゃ便利ですよね。
次回ログインを省略
override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) //もしユーザー名が保存されてるなら if let _ = UserDefaults.standard.object(forKey: "userName") { performSegue(withIdentifier: "goTimeLine", sender: nil) } }
僕は最初、viewWillAppear()の中に書きましたが、ログイン画面を省略できませんでした。
teratailで質問すると、
「viewWillAppear()はviewが生成される直前に呼ばれるので、遷移する処理は実行されません。」
「viewDidAppear()で実装してください」
と言われ、viewDidAppear()に書いたら、うまく動作しました。
viewのライフサイクルを学ばないといけませんねぇ。
デメリット
上記のコードの場合、「1度ログインしたユーザーは無条件でログインできる」こと。
例えば、一般的なサイトの場合、
会員登録する
↓
次回ログイン時に、個人情報を入力
↓→合致しない場合、再ログインが要求される
保存した個人情報と合致すればログインされる
というプロセスになっています。
対して、今回の記事で紹介したUserDefaultsによるログイン機能1は、入力したユーザー名は保存されるけど、次回以降は入力したデバイスを使えば誰であろうと無条件でログインできてしまいます。
今回のコードは、タイムラインでコメントなどを表示するアプリで使用したコードです。
別の記事で、入力したユーザー名がUserDefaultsに合致するかを判断する機能をご紹介します。
まとめ
100万人ものユーザーが利用するサービスだと、FirebaseやAWSなどの大規模なデータベースにユーザーの個人情報を保存するのでしょうが、個人で作るようなアプリならFirebaseやUserDefalutsで十分です。
別にリリースするつもりがなければ、UserDefaultsで事足りるでしょう。