XcodeGen と Mint を使った LicensePlist の導入方法

XcodeGen と Mint を使って LicensePlist を導入する際の手順をこの記事で紹介する。

導入手順としては、大きく分けて以下の手順がある。

  1. Mintfile に LicensePlist を追加してローカルにインストールする
  2. Setting.bundle を作成する
  3. XcodeGen の設定を変更する
  4. .gitignore で自動生成ファイルを無視するようにする

では、それぞれ詳しく解説する。

Mintfile に LicensePlist を追加する

LicensePlist は Homebrew や CocoaPods でインストールが可能だが、今回は Mint 経由でローカルの開発環境にインストールする。

リポジトリ にあるように $ mint install mono0926/LicensePlist でインストール可能。
Mintfile をプロジェクトに入れて Git 管理している場合もあると思うので、その場合は以下のように記述する。

これで $ mint bootstrap を叩けばインストールされる。

Settings.bundle を追加する

今回は設定アプリにライセンスを表示するが、設定アプリ上での表示を編集するには Settings.bundle というファイルが必要になる。

Xcode > file > New > File… を選択して出てきたウィンドウで setting 等を filter 欄に入力して、出てきた Settings.bundle を選択する。
今回は $SRCROOT/YourApp/Resource の配下に生成する。

Xcode での Setting.bundle

Resourceツリー

生成した Settings.bundle を開いてみると en.lproj というフォルダがあるが、これはローカライズ用のファイルで、英語用のものである。

もし英語 + 日本語を対応したい場合はこちらのフォルダをコピーして ja.lproj にリネームすればよく、日本語だけ対応したい場合はこのフォルダを直接リネームすればよい。
他の言語も対応したい場合は、対応したい言語分 ${言語名}.lproj フォルダを作ることになる。

ja.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

参考文献

  1. GitHub, Mint
  2. GitHub, LicensePlist
  3. Apple, Settings Application Schema Reference
Built with Hugo
テーマ StackJimmy によって設計されています。