NCMBを用いた匿名ログイン機能


#はじめに

今回はNCMBを用いた匿名ログインの機能を書いていきたいと思います。
匿名ログイン機能とは、その名のとおり個人情報を入力することなくサービスを使えるようにする仕組みのことです。

匿名ログイン機能を実装することで、会員登録はハードルが高いけど、それぞれのユーザーを識別したいなっていう場合などに役に立ちます！

#目次

&emsp;&emsp;[1.&emsp;初期状態](#1初期状態)
&emsp;&emsp;[2.&emsp;コードを書こう！](#2コードを書こう!)

# 1.初期状態
```swift

import UIKit

@main
class AppDelegate: UIResponder, UIApplicationDelegate {
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        return true
    }
    // MARK: UISceneSession Lifecycle
    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
    }

    func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
    }
}


```

# 2.コードを書こう！
####2.1 NCMBの登録
`AppDelegate`の`didFinishLaunchingWithOptions`の関数に記述します。
NCMBを利用するのでpodをインストールしてください。（ここは`NCMB 導入編`で記述してあるので省略します）

```swift

import UIKit
//NCMBをインポートする
import NCMB

@main
class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        //アプリケーションキーとクライアントキーの設定
        let applicationKey = "アプリのアプリケーションキー"
        let clientKey = "アプリのクライアントキー"
        NCMB.setApplicationKey(applicationKey, clientKey: clientKey)
        
        return true
    }
        //その他は略します

}
```

####2.3 NCMB側で匿名ログインを許可する
NCMBを開き「`アプリの設定`」→「`基本`」→「`匿名設定`」→`匿名会員の利用 - 許可する`
NCMB側の設定は以上で完了です。
![スクリーンショット 2021-11-30 午後5.35.03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583218/bbeb7e96-6cef-bd7f-259b-a5352f27557b.jpeg)


####2.2 匿名ログインの機能のコード
先ほどと同様に`AppDelegate`の`didFinishLaunchingWithOptions`の関数に記述します。
アプリ内に情報を保存しておくUserDefaultsを利用します。

```swift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        
        let applicationKey = "アプリのアプリケーションキー"
        let clientKey = "アプリのクライアントキー"
        

        NCMB.setApplicationKey(applicationKey, clientKey: clientKey)
  
        //UserDefaultsの`uuid`キーの情報を変数uuidに代入
        let uuid = UserDefaults.standard.string(forKey: "uuid")
               if uuid == nil{
                   //変数uuidが空だった場合 = ログインユーザーがいない場合
                   //NCMBのNCMBAnonymousUtils.logIn関数を利用し、匿名ログインを実施
                   NCMBAnonymousUtils.logIn { (user, error) in
                     if error != nil {
                       //エラーが出た場合出力
                       print ("Log in failed")
                     } else {
                       //エラーが出ない場合
                       //ログインユーザーのオブジェクトIDをコンソールに出力（実際にできているのか確認するため）
                       print("Logged in" + NCMBUser.current().objectId)
                       //変数authDataを宣言し、ログインユーザーのauthDataカラムを代入
                       let authData = user!.object(forKey: "authData") as! [String: Any]
                       //変数uuidを宣言し、変数authDataのanonymousキーの中身を代入
                       let uuid = (authData["anonymous"] as! [String: String])["id"]
                       //UserDefaulsのuuidキーに変数uuidの中身を保存する
                       UserDefaults.standard.set(uuid, forKey: "uuid")
                     }
                   }
               }else{
                   //変数uuidが存在した場合 = ログインユーザーがいる場合
                   //NCMBUser型のユーザーuserを作成
                   let user = NCMBUser.init()
                   let anonymousDic = ["anonymous": ["id": uuid]]
                   //userのauthDataキーにanonymousDicを保存
                   user.setObject(anonymousDic, forKey: "authData")
                   //保存したauthDataなどの情報に当てはまるユーザーでログインをする
                   user.signUpInBackground({(error) in

                     if error != nil {
                       //エラーが出た場合出力
                       print("Error")
                     } else {
                       //ログインユーザーのオブジェクトIDをコンソールに出力（実際にできているのか確認するため）
                         print("Log in" + NCMBUser.current().objectId)
                     }
                   })
               }
        
        
        return true
    }

```

#完成形
実行結果はコンソールに出力されています。
1回目に実行したときは、ログインユーザーが存在しないため匿名ログインを実施、2回目に実行した時は、ログインユーザーが存在するためUserDefaultsに保存されているauthDataを元にログインを実施されています。

![Nov-30-2021 18-20-21.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583218/a6bc64b9-61f6-bab2-ef18-8a41bab217da.gif)


# 終わりに
以上で匿名ログイン機能は完成になります。
このようなログイン方法を用いることで会員登録をすることなく、ユーザーが気軽に利用できるアプリケーションを開発することができます。


# 不備/疑問点アンケート
教材の不備を見つけた方や、わからなかったこと、もっと詳しく解説してほしいことに関しては、[こちらの学習進捗フォーム](https://forms.gle/V5bbKcPUaoeNmDMTA)に答えてください！

著者：**髙橋直輝**