iOSアプリのライセンス生成ツール「LicensePlist」のセットアップ&操作方法

## はじめに

ライセンス表示を手動で実装するのが手間なので、導入することにしました。

## 「LicensePlist」とは？

CarthageとCocoaPods、SwiftPMで管理しているライブラリのライセンス表示を自動的に生成するツールです。
設定ファイルを用意することで、任意のライブラリに対しても生成できるようです。

## 環境

- OS：macOS Mojave 10.14.6
- Swift：5.1.3
- Xcode：11.3.1 (11C504)
- LicensePlist：2.12.0

## セットアップ

### LicensePlistのインストール

[Mint](https://github.com/yonaskolb/Mint)からインストールします。

```diff:Mintfile
+ mono0926/LicensePlist@2.12.0
```

```shell-session
$ mint bootstrap
```

その他の方法でインストールするには、公式ドキュメントをご参照ください。
https://github.com/mono0926/LicensePlist#installation

### Settings Bundleの追加

プロジェクトに `Settings.bundle` がない場合、[こちら](https://qiita.com/uhooi/items/0a57cad6e7ca8e30f09a#settings-bundleの追加)の記事を参考に追加してください。
記事の内容と異なり、製品ターゲットのフォルダ内に作成していいと思います。

### Settings Bundleの編集

まず、[こちら](https://qiita.com/uhooi/items/0a57cad6e7ca8e30f09a#settings-bundleの編集)の記事を参考に、デフォルトで配置されている内容を削除します。

__以下のItemを追加__
<img width="508" alt="スクリーンショット_2020-02-04_17_08_43.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/309a0c1a-9e0d-f2dd-2420-dce803bfcb3a.jpeg">

|Key|Type|Value|
|:--|:--|:--|
|Type|String|Child Pane|
|Title|String|Licenses|
|Filename|String|com.mono0926.LicensePlist|

`Title` の `Value` は任意の値でOKです。

デフォルトだと3つ目は `Filename` でなく `Key` となっているので、忘れずに変更します。
変更が漏れると設定画面にライセンスが表示されません。

## 操作方法

### ライセンスファイルの生成

`Cartfile` ファイルや `Pods` フォルダがあるフォルダで `license-plist` コマンドを実行します。

```shell-session
$ mint run LicensePlist license-plist --output-path ${PRODUCT_NAME}/Settings.bundle
```

以下の3ファイルが `Settings.bundle` 内に生成されます。
<img width="355" alt="スクリーンショット_2020-02-04_17_23_53.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/98036d88-265a-874d-f37e-594534affa8f.jpeg">

XcodeGenを使っている場合、プロジェクトファイルを再生成した方がいいと思います。

私はMakefileを作成し、 `make generate-license` を実行すると「ライセンスファイルの生成→プロジェクトファイルの生成→CocoaPods用ワークスペースの生成」を一括で行うようにしています。

```makefile:Makefile
PRODUCT_NAME := CurrencyConversion

.PHONY: generate-licenses
generate-licenses:
	mint run LicensePlist license-plist --output-path ${PRODUCT_NAME}/Settings.bundle
	$(MAKE) generate-xcodeproj

.PHONY: generate-xcodeproj
generate-xcodeproj:
	mint run xcodegen xcodegen generate
	$(MAKE) install-cocoapods

.PHONY: install-cocoapods
install-cocoapods:
	bundle exec pod install
```

## ライセンス表示までの画面遷移

ライセンスが表示されているか確認します。

__[設定]アプリを起動__
<img width="373" alt="Simulator_Screen_Shot_-_iPhone_11_Pro_Max_-_2020-02-04_at_17_47_50.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/28326a52-af61-9067-658c-6d87236a50ef.jpeg">

__対象のアプリをタップ__
<img width="373" alt="Simulator_Screen_Shot_-_iPhone_11_Pro_Max_-_2020-02-04_at_17_47_55.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/bbf58793-e5a9-75ae-fc7b-e02d02c0d8d4.jpeg">

__「Licenses」をタップ__
<img width="373" alt="Simulator_Screen_Shot_-_iPhone_11_Pro_Max_-_2020-02-04_at_17_47_58.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/686f7480-5cb2-4c01-fc48-859b60dfa98b.jpeg">

__「Moya」をタップ__
<img width="373" alt="Simulator_Screen_Shot_-_iPhone_11_Pro_Max_-_2020-02-04_at_17_48_00.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/57204cd5-205f-1a86-c78f-89fef36ef9da.jpeg">

Moyaのライセンスが表示されます。
<img width="373" alt="Simulator Screen Shot - iPhone 11 Pro Max - 2020-02-04 at 17.48.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/11a1d653-9c70-6293-9d59-d6cdea20d6b3.png">

設定画面にライセンスが表示されない場合、 `Root.plist` の指定に誤りがある可能性があるので、公式のサンプルを参考に見直してください。
https://github.com/mono0926/LicensePlist/blob/master/Settings.bundle.zip

## バージョン管理から無視する(任意)

生成されたライセンスファイルをバージョン管理の対象外にします。

Gitを使っている場合、以下を「.gitignore」に追加するのみでOKです。

```diff:.gitignore
+ com.mono0926.LicensePlist/
+ com.mono0926.LicensePlist.latest_result.txt
+ com.mono0926.LicensePlist.plist
```

こちらの設定は任意です。
バージョン管理するのもありだと思います。     

## おまけ：ライブラリのバージョン番号を表示する

`--add-version-numbers` オプションを付けることで、ライブラリのバージョン番号を表示できます。
https://github.com/mono0926/LicensePlist#--add-version-numbers

## おわりに

これでライセンス表示を実装する手間が省けます！
ただし、ライブラリの使用前にライセンスを確認するのは忘れないようにしましょう。

## 参考リンク

- [mono0926/LicensePlist: A license list generator of all your dependencies for iOS applications](https://github.com/mono0926/LicensePlist)