【iOS Swift】自動ログイン機能を実装しよう!

画像1

概要

  • ニフティクラウドmobile backendの『会員管理機能』を利用して、ゲームアプリによく見られる「自動ログイン機能」を実装したサンプルプロジェクトです
  • 「自動ログイン機能」とは、ユーザーが会員登録やログイン/ログアウトを意識することなく会員管理を行う機能です。通常の「会員管理機能」を応用して実装することが可能です。
  • 簡単な操作ですぐに ニフティクラウドmobile backendの機能を体験いただけます★☆

ニフティクラウドmobile backendって何??

スマートフォンアプリのバックエンド機能(プッシュ通知・データストア・会員管理・ファイルストア・SNS連携・位置情報検索・スクリプト)が開発不要、しかも基本無料(注1)で使えるクラウドサービス!

注1:詳しくはこちらをご覧ください

画像2

動作環境

  • Mac OS X 10.12(Sierra)
  • Xcode ver. 8.0
  • Simulator ver. 10.0
  • iPhone7
  • iOS SDK
  • Ver. 2.3.4

※上記内容で動作確認をしています。

手順

1. ニフティクラウドmobile backend の会員登録・ログインとアプリの新規作成

  • 上記リンクから会員登録(無料)をします。登録ができたらログインをすると下図のように「アプリの新規作成」画面が出るのでアプリを作成します

画像3

  • アプリ作成されると下図のような画面になります
  • この2種類のAPIキー(アプリケーションキーとクライアントキー)はXcodeで作成するiOSアプリにニフティクラウドmobile backendを紐付けるために使用します

画像4

2. GitHubからサンプルプロジェクトのダウンロード

  • 下記リンクをクリックしてプロジェクトをMacにダウンロードします
  • SwiftAutoLoginApp

3. Xcodeでアプリを起動

  • ダウンロードしたフォルダを開き、「SwiftAutoLoginApp.xcodeproj」をダブルクリックしてXcode開きます

画像9

画像6

  • 「SwiftAutoLoginApp.xcodeproj」(青い方)ではないので注意してください!

画像8

4. APIキーの設定

画像7

  • それぞれYOUR_NCMB_APPLICATION_KEYYOUR_NCMB_CLIENT_KEYの部分を書き換えます
  • このとき、ダブルクォーテーション(")を消さないように注意してください!
  • 書き換え終わったらcommand + sキーで保存をします

6. 動作確認と解説

  • Xcode画面の左上、適当なSimulatorを選択します
  • iPhone7の場合は以下のようになります
  • 実行ボタン(さんかくの再生マーク)をクリックします

画像5

  • アプリが起動します

初回起動時

ユーザー側では特に操作をすることなく、裏では新規会員登録とログインが行われます

アプリ側
  • 画面は次のようになります

画像10

クラウド側

画像11

  • ニフティクラウドmobile backendの「ユーザー名/パスワード」を使用して会員管理を行う機能を「自動ログイン機能」へ応用しています
  • ここでは、ユーザー名とパスワードとして、「端末ID(UDID)」を取得し起動時に認証を行うことで自動ログインを実現しています。
  • ダッシュボードの「userName」フィールドで登録された端末IDが確認できます。

2回目以降起動時

初回起動時に端末IDで会員情報が登録されているため、2回目以降起動時はログインが行われます

  • 左上の「■」ボタンをクリックしてプログラムを停止します
  • 再度、実行ボタン(さんかくの再生マーク)をクリックします
アプリ側
  • 画面は次のようになります

画像12

  • ニフティクラウドmobile backendの会員機能では会員毎に、会員登録やログインを行うたびに更新される「updateDate」というフィールドを持ち、この値を利用して、「最終ログイン」日時の表示をするようにしています
  • 「lastLoginDate」というフィールドに値を移して使用しています

画像13

  • 何度か起動し、アプリ側とダッシュボード側を確認してみましょう

参考

ここではサンプルアプリに実装済みの内容について紹介します

SDKのインポートと初期設定

ロジック

  • Main.storyboardでデザインを作成し、ViewController.swiftにロジックを書いています

自動ログイン処理

import UIKit
import NCMB

class ViewController: UIViewController {
    // label
    @IBOutlet weak var greetingMessage: UILabel!
    @IBOutlet weak var lastVisit: UILabel!
    @IBOutlet weak var dayAndTime: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        // labelの初期化
        greetingMessage.text = ""
        lastVisit.text = ""
        dayAndTime.text = ""

        // UUID取得
        let uuid = UIDevice.current.identifierForVendor?.uuidString
        print("uuid:\(uuid)")

        /* mBaaSログイン */
        NCMBUser.logInWithUsername(inBackground: uuid, password: uuid) { (user, login_error) in
            if login_error != nil {
                // ログイン失敗時の処理
                let login_err : NSError = login_error as! NSError
                print("ログインに失敗しました。エラーコード:\(login_err.code)")

                // 初回利用(会員未登録)の場合
                if login_err.code == 401002 { // 401002:ID/Pass認証エラー
                    /* mBaaS会員登録 */
                    let new_user = NCMBUser()
                    new_user.userName = uuid
                    new_user.password = uuid
                    new_user.signUpInBackground({ (signUp_error) in
                        if signUp_error != nil {
                            // 会員登録失敗時の処理
                            let signUp_err = signUp_error as! NSError
                            print("会員登録に失敗しました。エラーコード:\(signUp_err.code)")
                        } else {
                            // 会員登録成功時の処理
                            print("会員登録に成功しました。")

                            self.greetingMessage.text = "はじめまして!"

                            /* mBaaSデータの保存 */
                            let lastLoginDate = new_user.updateDate
                            new_user.setObject(lastLoginDate, forKey: "lastLoginDate")
                            new_user.saveInBackground({ (save_error) in
                                if save_error != nil {
                                    // 保存失敗時の処理
                                    let save_err = save_error as! NSError
                                    print("最終ログイン日時の保存に失敗しました。エラーコード:\(save_err.code)")

                                } else {
                                    // 保存成功時の処理
                                    print("最終ログイン日時の保存に成功しました。")

                                }
                            })

                        }
                    })
                }

            } else {
                // ログイン成功時の処理
                print("ログインに成功しました")

                self.greetingMessage.text = "おかえりなさい"
                self.lastVisit.text = "最終ログイン"

                // 最終ログイン日時取得

                let lastLoginDate = user?.object(forKey: "lastLoginDate") as! Date
                let formatter = DateFormatter()
                formatter.dateFormat = "yyyy/MM/dd HH:mm:ss"
                let dateStr = formatter.string(from: lastLoginDate)
                self.dayAndTime.text = "\(dateStr)"

                // ログイン日時の上書き
                let updateDate = user?.updateDate
                user?.setObject(updateDate, forKey: "lastLoginDate")
                user?.saveInBackground({ (save_error) in
                    if save_error != nil {
                        // 保存失敗時の処理
                        let save_err = save_error as! NSError
                        print("最終ログイン日時の保存に失敗しました。エラーコード:\(save_err.code)")

                    } else {
                        // 保存成功時の処理
                        print("最終ログイン日時の保存に成功しました。")
                    }
                })
            }
        }
    }
}