XcodeGen と Mint を使って LicensePlist を導入する際の手順をこの記事で紹介する。
導入手順としては、大きく分けて以下の手順がある。
- Mintfile に LicensePlist を追加してローカルにインストールする
- Setting.bundle を作成する
- XcodeGen の設定を変更する
.gitignore
で自動生成ファイルを無視するようにする
では、それぞれ詳しく解説する。
Mintfile に LicensePlist を追加する
LicensePlist は Homebrew や CocoaPods でインストールが可能だが、今回は Mint 経由でローカルの開発環境にインストールする。
リポジトリ にあるように $ mint install mono0926/LicensePlist
でインストール可能。
Mintfile をプロジェクトに入れて Git 管理している場合もあると思うので、その場合は以下のように記述する。
mono0926/[email protected]
これで $ mint bootstrap
を叩けばインストールされる。
Settings.bundle を追加する
今回は設定アプリにライセンスを表示するが、設定アプリ上での表示を編集するには Settings.bundle
というファイルが必要になる。
Xcode > file > New > File… を選択して出てきたウィンドウで setting 等を filter 欄に入力して、出てきた Settings.bundle
を選択する。
今回は $SRCROOT/YourApp/Resource
の配下に生成する。
生成した Settings.bundle
を開いてみると en.lproj
というフォルダがあるが、これはローカライズ用のファイルで、英語用のものである。
もし英語 + 日本語を対応したい場合はこちらのフォルダをコピーして ja.lproj
にリネームすればよく、日本語だけ対応したい場合はこのフォルダを直接リネームすればよい。
他の言語も対応したい場合は、対応したい言語分 ${言語名}.lproj
フォルダを作ることになる。
この状態でビルドして、設定アプリから作成中のアプリの設定画面に遷移すると、以下のような表示になっているはずだ。
これは Root.plist
の記述によって生成されている。
今回は「ライセンス」というセルを作って、ここを選択するとライセンスの一覧が表示されるといった画面にしてみる。
そのためには、 Root.plist
を以下のように書き換えれば良い。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>StringsTable</key>
<string>Root</string>
<key>PreferenceSpecifiers</key>
<array>
<dict>
<key>Type</key>
<string>PSChildPaneSpecifier</string>
<key>Title</key>
<string>Licenses</string>
<key>File</key>
<string>com.mono0926.LicensePlist</string>
</dict>
</array>
</dict>
</plist>
わかりにくいかもしれないが、元々の plist の内、 array
の中身を書き換えている。
もっと詳しく知りたい場合は 公式リファレンス を参照されたい。
次に、 Licenses
という固定文言があるので、それを「ライセンス」と表示されるように ja.lproj
ファイルで定義しておく。
"Licenses" = "ライセンス";
これでビルドすると、「ライセンス」という Push 遷移可能なセルだけになったと思う。
XcodeGen を設定する
次に、ビルド時に LicensePlist によってファイルの生成がなされるようにする。
XcodeGen の yml によって prebuildScripts
で設定を行う。
以下のような project.yml
があるとする。
name: YourApp
options: ...
configs: ...
settings: ...
targets:
YourApp:
dependencies: ...
info: ...
platform: iOS
setting: ...
...
この YourApp
ターゲットに対して以下のような prebuildScripts
を設定する。
targets:
YourApp:
prebuildScripts:
- name: LicensePlist
script: |
if mint list | grep -q 'LicensePlist'; then
mint run LicensePlist \
--output-path iosApp/Resource/Settings.bundle \
--suppress-opening-directory \
--fail-if-missing-license
else
echo "error: LicensePlist not installed; run 'mint bootstrap' to install"
exit -1
fi
いくつかオプションを指定しているが、この辺りは リポジトリの README を参照されたい。
また、 GitHub のアクセストークンを使用する場合はオプションを使う必要があるので、必要に応じて指定しておく。
これでビルド時に LicensePlist が実行されるようになった。
試しにビルドしてみて 設定アプリ > YourApp > ライセンス と遷移してライブラリのライセンスが表示されていれば導入に成功している。
チーム開発のときに GitHub アクセストークンを指定する方法
ここからはチーム開発を前提とした設定になる。
LicensePlist は README にある通り、 GitHub API を使っているので、 API 制限に引っかかって割と簡単にエラーになってしまう。
そのために --github-token
オプションで個人のトークンを指定するのだが、チーム開発の時に誰かのアクセストークンを指定するのは良くない。
そんな時は以下の例のようにすると、各々のトークンを使用することが可能になる。
targets:
YourApp:
prebuildScripts:
- name: LicensePlist
script: |
if [[ ! -z "$GITHUB_ACCESS_TOKEN" ]]; then
GITHUB_TOKEN_OPTION="--github-token $GITHUB_ACCESS_TOKEN"
fi
if mint list | grep -q 'LicensePlist'; then
mint run LicensePlist \
--output-path iosApp/Resource/Settings.bundle \
--suppress-opening-directory \
--fail-if-missing-license \
$GITHUB_TOKEN_OPTION
else
echo "error: LicensePlist not installed; run 'mint bootstrap' to install"
exit -1
fi
これを project.yml
に反映させたら、後は個人で $GITHUB_ACCESS_TOKEN
環境変数を追加する。
export GITHUB_ACCESS_TOKEN=${Your_token}
トークンは GitHub のこちらのページ から生成できる。
.gitignore
で自動生成ファイルを無視するようにする
Git 管理してない場合はこの工程は不要である。
自動生成ファイルはビルドすれば生成されるし、余計な diff を出さないためにも生成されるファイルは Git 管理したくない。
そこで、以下のように .gitignore
に追加して Git 管理から外しておく。
# 今まであった gitignore 指定
# LicensePlist
**/Settings.bundle/com.mono0926.LicensePlist
**/Settings.bundle/com.mono0926.LicensePlist.latest_result.txt
**/Settings.bundle/com.mono0926.LicensePlist.plist