Swiftにおけるキーの隠蔽化（plistの利用）

NCMBではアプリケーションキーとクライアントキーを使ってバックエンドサービスを利用します。この2つのキーをどこに書いておくかでメンテナンス性やセキュリティ性が担保されるでしょう。

いくつかの方法がありますが、今回はplistを利用した方法でキーの隠蔽化を行います。

## 参考

[API keyを.plistにStringで保存して隠す(例: Google Maps Api) - Qiita](https://qiita.com/Saayaman/items/c50000e6103358c8c4d6)を参考にさせてもらいました。

### KeyManagerの追加

適当なファイル（でなくてもOK）を作って、KeyManagerを定義します。

```swift
struct KeyManager {
    private let keyFilePath = Bundle.main.path(forResource: "APIKey", ofType: "plist")
    func getKeys() -> NSDictionary? {
        guard let keyFilePath = keyFilePath else {
            return nil
        }
        return NSDictionary(contentsOfFile: keyFilePath)
    }
    func getValue(key: String) -> AnyObject? {
        guard let keys = getKeys() else {
            return nil
        }
        return keys[key]! as AnyObject
    }
}
```

## plistファイルの作成

新しいファイル（Property List）を作成し、名前をAPIKeyとします。

![ScreenShot_ 2021-08-02 9.40.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/03f4554c-3df7-85dd-cb58-6212b607ba09.png)


その中にapplicationKeyとclientKeyという2つのキーの定義と、NCMBから付与される文字列を記述します。

![ScreenShot_ 2021-08-02 9.41.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/d7dc5828-e6a6-f015-048d-1d5303d3b3ba.png)


## SDKのインストール

NCMBのSwift SDKをインストールするのはSwift Packagesを使うのが簡単でしょう。FileメニューからSwift Packages > Add Package Dependencyと選択します。

![ScreenShot_ 2021-08-02 9.35.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/dea9dcdc-3368-7992-67d4-8375355bf2ff.png)


出てきたダイアログでSwift SDKのGitリポジトリURLを入力します。GitHubのリポジトリでHTTPSとして取得できるもの、または下記URLになります。

![ScreenShot_ 2021-08-02 9.35.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/8d5d62cd-cf3f-f535-8f71-f1e61569674a.png)


```
https://github.com/NIFCLOUD-mbaas/ncmb_swift.git
```

バージョンは最新のものでかまいません。

![ScreenShot_ 2021-08-02 9.36.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/9e873825-38be-97e2-edd3-44776cc72d22.png)


後はFinishボタンを押せば完了です。

![ScreenShot_ 2021-08-02 9.36.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/7f74527e-8de8-d5cf-b433-c16b538c24f1.png)


## 初期化

今回はSwiftUIを利用しています。ライフサイクルはSwiftUI Appです。

まずSDKをインポートします。

```swift
import SwiftUI
import NCMB
```

次に `scenePhase` を追加します。

```swift
@main
struct forumApp: App {
    // 追加
    @Environment(\.scenePhase) private var scenePhase
```

後は body 内で `onChange` を使って初期化します。キーは `KeyManager().getValue` で取得できます。

```swift
var body: some Scene {
    WindowGroup {
        ContentView()
    }.onChange(of: scenePhase) { scene in
        switch scene {
        case .active:
            // キーの取得
            let applicationKey = KeyManager().getValue(key: "applicationKey") as! String
            let clientKey = KeyManager().getValue(key: "clientKey") as! String
            // 初期化
            NCMB.initialize(applicationKey: applicationKey, clientKey: clientKey)
        case .background: break
        case .inactive: break
        default: break
        }
    }
}
```

## Gitリポジトリに登録しないようにする

後は APIKey.plist を.gitignoreに登録しておけば、バージョン管理対象外になりますので、Gitリポジトリに誤って載せてしまうこともないでしょう。

```
echo (プロジェクト名)/APIKey.plist >> .gitignore
```

## まとめ

キーをコード中に書くとメンテナンス性が悪くなったり、開発環境と本番環境を分けて管理するのも面倒になります。Property ListであればXcode標準の仕組みになるので、外部ライブラリをインストールすることもなく、手軽に使えるでしょう。

[mBaaSでサーバー開発不要！ | ニフクラ mobile backend](https://mbaas.nifcloud.com/)