はじめに
個人開発をする中でTwitterやFirebaseなど様々な情報を扱うか模索していて行き着いた一例を紹介します。
やりたいこととしては「各種APIを叩くためのシークレット情報などをアプリに直接ソースコードに持ちたくはないが、参照できること」です。
方法としては、Sourceryを用いてSecret.swiftを自動生成することにしました。
cocoapods-keysを利用する方法もありますが、Cocoapodsを利用していないため代替手段を模索することにしました。
以下に、手順を示していきます。
手順
- Sourceryの導入
- テンプレートの作成
- 設定ファイル作成
- 自動化スクリプトの追加
-
.gitignore
に追記
1. Sourceryの導入
SourceryはSwift用のコードジェネレータライブラリです。
よくあるEquatableの実装など、何度も書くような実装を自動化してくれます。
Xcode -> File -> Swift Packages -> Add Package Dependency からhttps://github.com/krzysztofzablocki/Sourcery
のURLを入力して任意のバージョンを入れます。
2. テンプレートの作成
生成するSwiftファイルのテンプレートを作ります。
今回はTwitterAPIを利用したアプリを制作していたのでその変数をstaticで定義し、値の入力にはargument
enum Secret {
static let twitterConsumerKey = "{{argument.twitterConsumerKey}}"
static let twitterConsumerKeySecret = "{{ argument.twitterConsumerKeySecret }}"
}
3. 設定ファイル作成
.sourcery.secret.yml
という名前でsourcryファイルを作ります。
templates
で(2)で追加したファイルを読み込み、
output
で成果物をGeneratedディレクトリに生成します。
sources:
- SampleApp
templates:
- Templates/Secret.stencil
output:
path: Generated/
link:
project: SampleApp.xcodeproj
target: SampleApp
group: SampleApp
args:
twitterConsumerKey: "実際のKey"
twitterConsumerKeySecret: "実際のSecret"
4. 自動化スクリプトの追加
以下のshell scriptをBuild Phases
に追加します。
mkdir -p Sourcery
sourcery --config .sourcery.secret.yml
追加する前にターミナルで正しく実行されるか確認してみると良いかと思います。
Compile Sources
の前に追記すると良いでしょう。
あとは出来上がったSecret.generated.swift
をプロジェクトに追加すると、Secret.twitterConsumerKey
などを参照できるようになるかと思います。
5. .gitignoreに追記
シークレットの情報が入ったファイル群は .gitignore
に入力して保存されないようにします。
.sourcery.secret.yml
Sourcery
おわりに
雑にまとめてみましたが、質問などあればTwitter(@mtfum)にお願いします!
ymlファイルのoutputでlinkなどを書いていますがきちんと機能しているのかあまりよくわかっていません。。
また、変数の変更時にテンプレート(Templates/Secret.stencil
)と設定ファイル(.sourcery.secret.yml
)を変更しなければならないのがまだ冗長的で課題なのでより簡潔になる方法がわかれば追記しようと思います。
ご存知の方がいらっしゃれば教えてください!