🗝️

【Swift】本番環境のAPIキーを管理する

2024/04/28に公開

初めに

今回は本番環境でAPIキーを利用するときにその管理方法を簡単に共有したいと思います。
外部のサービスを使うときにはAPIキーを利用する機会もあるかと思いますが、キーを外部に出すことなく本番環境で使用するための実装を行います。

記事の対象者

  • Swift 学習者
  • 本番環境でAPIキーを管理したい方

実装

  1. Config.xcconfigファイルの作成と設定
  2. Info.plistでのAPIキーの参照設定
  3. .gitignore の追加
  4. 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 します。

.gitignore
Config.xcconfig

このとき、.gitignore を追加した変更のみをプッシュしておくことで Config.xcconfig を管理から除外することができます。

4. APIキーの取得

最後にプロジェクトから APIキーを取得する際の実装を行います。
コードは以下の通りです。

APIKeyManager.swift
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
    }
}
WhereYouWantToUseApiKey.swift
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.plistGOOGLE_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