【Swift】本番環境のAPIキーを管理する
初めに
今回は本番環境でAPIキーを利用するときにその管理方法を簡単に共有したいと思います。
外部のサービスを使うときにはAPIキーを利用する機会もあるかと思いますが、キーを外部に出すことなく本番環境で使用するための実装を行います。
記事の対象者
- Swift 学習者
- 本番環境でAPIキーを管理したい方
実装
- Config.xcconfigファイルの作成と設定
- Info.plistでのAPIキーの参照設定
- .gitignore の追加
- APIキーの取得
1. Config.xcconfigファイルの作成と設定
Config.xcconfigファイル追加
まずはアプリで使用するサービスのAPIキーを保存しておくためのファイルを作成します。
プロジェクトのルートディレクトリで右クリックして 「New File...」 を選択して 「Configuration Settings File」 を選択します。このときファイル名は「Config.xcconfig」としておきます。
Config.xcconfigファイル編集
作成した Config.xcconfig
ファイルを開いてアプリで使用するサービスのAPIキーを以下のように設定します。
API_KEY = YOUR_API_KEY
GOOGLE_API_KEY = YOUR_GOOGLE_API_KEY
2. Info.plistでのAPIキーの参照設定
次に作成した Config.xcconfig
ファイルを Info.plist
から参照します。
プロジェクトの Info.plist
を開き、新しい行を追加します。
なお、APIキーを複数保持したい場合は APIKeys
として dictionary 型を選択し、その子要素としてそれぞれのAPIキーを保存するとキーを一箇所にまとめられます。
キーの名前を API_KEY
などとし、値に ${API_KEY}
と入力します。
このとき、中括弧に入る値は Config.xcconfig
ファイルで設定した値にしておく必要があります。
具体的には以下のような設定になります。
次にプロジェクトのファイルを選択し、 Project > Info > Configuation の項目で Debug, Stg, Release の三つの Configuation File
を設定します。
通常の開発であればそれぞれの環境によってAPIキーを変更したりすることもあるかと思うので、ここで Config.xcconfig
を使い分けます。
具体的には Config_Debug.xcconfig
, Config_Stg.xcconfig
, Config_Release.xcconfig
などのように分けておき、別々の値を保存しておきます。
今回は一つしか Config.xcconfig
を作成していないので、それを指定します。
3. .gitignore の追加
次に変更内容を GitHub に上げた際にAPIキーが公開されないように .gitignore
の設定を行います。
ルートディレクトリに .gitignore
がある場合はそれを開きます。ない場合は「New File...」 から「Empty」 を選択して、ファイル名を .gitignore
としておきます。
.gitignore
を開いて以下のように Config.xcconfig を除外します。
Configファイルが環境に合わせて複数ある場合はそのファイルが含まれるディレクトリごと ignore します。
Config.xcconfig
このとき、.gitignore
を追加した変更のみをプッシュしておくことで Config.xcconfig
を管理から除外することができます。
4. APIキーの取得
最後にプロジェクトから APIキーを取得する際の実装を行います。
コードは以下の通りです。
import Foundation
class APIKeyManager {
static let shared = APIKeyManager()
private init() {}
func apiKey(for service: String) -> String? {
guard let keys = Bundle.main.infoDictionary?["APIKeys"] as? [String: Any],
let key = keys[service] as? String else {
return nil
}
return key
}
}
guard let googlePlacesKey = APIKeyManager.shared.apiKey(for: "GOOGLE_PLACE_API_KEY") else {
debugPrint("API Key not found")
return nil
}
APIKeyManager
はAPIキーを取得する際に使用するクラスです。Info.plist
に記録したキーの名前を apiKey
の引数に渡すことでAPIキーを参照することができます。
上の例では Info.plist
に GOOGLE_PLACE_API_KEY = ${GOOGLE_PLACE_API_KEY}
として登録してあるAPIキーを呼び出しています。
呼び出したAPIキーやURLに含めるなどして使用できます。
Config を複数設けている場合は、App Store Connect に配布するための Archive を作成する際、Build Configuration が Release などの本番用の設定になっていることを確認して Archive を作成すれば完了です。
これで本番環境でも使用できるAPIキーの設定が完了です。
まとめ
最後まで読んでいただいてありがとうございました。
今回はAPIキーを本番環境で扱うための方法を簡単にまとめました。
この方法で以下の二つの条件を満たすことができました。
- GitHubにキーを公開しない
- Appleの審査で不具合なく動作する
今回初めて本番環境でAPIキーを管理する実装を行なったため、誤っている点やもっと良い書き方があればご指摘いただければ幸いです。
Discussion