こんにちは, またくです。

iOS でアプリを作っている時に, コード内で秘匿したい鍵の値を参照したい場合がありました。 元々 private repository で開発していたので直書きでも良いのですが, アプリを作成したら public にするということで進めていたので, .env ファイルで鍵を管理できるようにしています。そのために使えるのが cocoapods-keys です。

cocoapods-keys は cocoapods のプラグインとして提供されています。これを入れると, SampleAppKeys().secretKey みたいにコード内で参照できるようになります。

Installation

cocoapods と cocoapods-keys をインストールします。
gem install でも良いですが, 現実的には以下のように Gemfile を記述して, bundle install してバージョン管理するかなと思います。


source "https://rubygems.org"
gem 'cocoapods'
gem 'cocoapods-keys'

インストール後, 以下のように Podfile に Key を記述します。


plugin 'cocoapods-keys', {
  :project => 'sunset',
  :keys => [
    'APIKEY',
    'BUILDSECRET',
    'consumerKey',
    'consumerSecret'
  ]
}

この内容は, .env に記述されているものと一致する必要があります。
今回の例では


APIKEY="myApiKey"
BUILDSECRET="myBuildSecret"
consumerKey="myConsumerKey"
consumerSecret="myConsumerSecret"

のようになります。

Podfile を埋めたら, pod install を実行します。 値が設定されているかどうかは, pod keys で確認できます。実際の鍵の値は出力されません。


$ bundle exec pod keys
Keys for sunset
APIKEY -
BUILDSECRET -
consumerKey -
consumerSecret -

呼び出し方

“\(プロジェクト名)Keys” で鍵のクラスが生成されるので, それを用いて鍵の値を参照することができます。 Pods/ 以下に *.m とか *.h のファイルがあるかと思います。 Pods/ 以下は gitignore で除外設定していれば問題ないはずです。cocoapods でライブラリ管理しているならば, 多分もうしているでしょう。


import Keys

class test {
  let sunsetKeys: SunsetKeys = SunsetKeys()
  // consumerKey の参照
  let consumerKey = sunsetKeys.consumerKey
  // APIKEY の参照
  let apiKey = sunsetKeys.aPIKEY
}

生成される鍵のプロパティは lowerCamel で出るらしく, 上のような APIKEY などは aPIKEY のようになってしまうようでした。 そのため, 元々の鍵の名前自体を lowerCamel にしておくのが良いかなと思います。

その他

Cocoapods-keys とは関係ないですが, fabric を導入した際に, Run script 内にも鍵の情報を書かないといけない場面がありました。

そこでは, source .env をして, 環境変数として読み込ませる形で対応しました。