はじめに
サーバーエンジニアレスを実現するためにここでは、ニフクラ mobile backend (以下mBaaS)を使用しています。本来は「ユーザー名/パスワード」をユーザーに入力させ、ログインを行う機能として提供されていますが、これを応用することで、せっかくなので__今流行の「自動ログイン」を実現できないかな?__と考えてみたのが始まりです。作ってみたら思ったより簡単に作ることが出来ましたので、ご紹介します。
自動ログインの実現方法
端末のUDIDを取得
-
もともとmBaaSが備えている会員の認証機能としては「ユーザー名/パスワード」をユーザーに決めさせ(新規登録)、入力させる(ログイン)を行うものです。なので、この「ユーザー名/パスワード」として、端末固有のUDID(ユニークデバイスID)を取得し裏側で処理を行う方法を考えました。
-
ちなみに、Swiftだと次のコードでUDIDを取得できます。UDIDはユニーク値なので、UUIDと表記しています。
// UUID取得
let uuid = UIDevice.current.identifierForVendor?.uuidString
ユーザーにログインしたことを意識させずにログインさせる
- アプリを起動して画面が表示されるときに次のような処理を行います。(初回表示画面のviewDidLoad()内)
NCMBUser.logInWithUsername(inBackground: uuid, password: uuid) { (user, login_error) in //★1
if login_error != nil {
// ログイン失敗時の処理
// 初回利用(ユーザー未登録)の場合
if login_err.code == 401002 { // 401002:ID/Pass認証エラー ★2
/* ★3 */
}
} else {
// ログイン成功時の処理
}
}
}
- 先ほど取得したUDID(uuid)を使って「ユーザー名/パスワード」としてログイン処理を行っています(★1)
- ただ初回利用時はエラーになります。ユーザーとしてがまだ登録されていないためです。その場合のエラーは「E401002:ID/Pass認証エラー」となります。このエラーが出たときは、ユーザー登録処理を行います。(★2)ここでもUDID(uuid)を使用すればOKですね。
- ★3に入るユーザー登録処理は以下のように書けます。
/* mBaaSユーザー登録 */
let new_user = NCMBUser()
new_user.userName = uuid
new_user.password = uuid
new_user.signUpInBackground({ (signUp_error) in
if signUp_error != nil {
// ユーザー登録失敗時の処理
} else {
// ユーザー登録成功時の処理
}
})
これで実装完了ですね!
おわりに
ポイントは「401002:ID/Pass認証エラー」で場合分けけすること
ポイントは「ユーザーにログインしたことを意識させずにログインさせる」ことです。なので、新規登録なのか、ログインなのか、判断を裏側で行うように書くことでした。ただ、「401002:ID/Pass認証エラー」で場合分けして後はログインなのか新規登録なのかドキュメント通りにコードを書くだけ!サーバーの知識なんて一切必要ありませんでした。簡単でしたね。ぜひアプリに実装してみてはいかがでしょうか。
実装済みのサンプルアプリあります
上記で説明した内容を実装した簡単なサンプルを用意していますので、よろしければご利用ください
GitHub | 動作環境 |
---|---|
SwiftAutoLoginApp | Xcode ver. 8.2.1 iOS SDK Ver. 2.3.4 |
※動作環境は、こちらで動作確認したもですので、上記以外の環境でも動作します。
※使用方法はREADMEをご確認ください