Edited at

iOSアプリのライセンス一覧のplistを半自動生成して設定画面にキレイに表示するプログラムをGo言語で作った

More than 1 year has passed since last update.


【追記】Swift版の mono0926/LicensePlist を作ったのでそちらがオススメです

以下、 mono0926/ios-license-generator の紹介記事ですが、Swiftで作り直した mono0926/LicensePlist を使うことをオススメします。

移植ではなく、手法自体がらりと変えました。

(生成物の形式はほぼ一緒です。)


しばらく前ですが、今開発中のPlayer!向けに、このようなキレイなライセンス一覧を半自動生成するプログラムをGo言語で書きました。

もちろんすでに何かやり方無いか調べたのですが、やりたいことを満たすものが見つからなかったので。

ライセンス一覧・詳細


プログラムの置き場所など

Go言語、実行ファイル作るの簡単で良いですねと改めて思いました。

plistのtemplateファイルも go-bindataを使って簡単に同梱出来ちゃいました。

参考: go-bindata でコンパイル時にリソースを埋め込んじゃおう! - Qiita

Goのプログラム自体は初心者レベルなので、お手柔らかにお願いします( ´・‿・`)


他のやり方の問題点


カスタムで画面作る方法

これは、初めに画面組むのもその後のメンテナンスもけっこう手間なので、避けたかったです。


CocoaPodsでライセンス表記を自動生成

これはけっこう有名な方法なので、やっている人多いと思います。

以下の問題があって選択肢から外れました。


  • CocoaPods以外で導入しているライブラリに対応できない(ですよね??)


    • Carthage経由

    • 何らかの事情でソースそのまま追加したり、Git Submoduleで導入している場合など



  • あまりキレイじゃない


    • 全てのライセンスが単一のplistとして出力されて、ライセンス一覧としてキレイじゃない




今回やった方法

「CocoaPods以外で導入しているライブラリに対応」するためには、別途簡単なリストで管理しているライセンス一覧をソースにするしか無さそう、という判断の下、以下のような仕組みにしました。


  • Markdownで簡単なライセンス一覧を記述

  • プログラムでそれをパースして、ライセンス文章をダウンロードしてきて、Settings.bundle(設定アプリ内に表示するやつ)形式のplistとして出力


    • CocoaPodsからの自動生成と違って、冒頭に貼ったスクリーンショットのようにテーブルビュー + 詳細という構成




使い方


ライセンス一覧のMarkdownファイルを用意

こんなファイルを用意します。(テキストで貼ってもちゃんと表示されないのでスクリーンショット)

多少ですが、面倒ではあります( ´・‿・`)

一応OSS使うマナーとして、ライセンスなど確認した上で導入するはずなので、そのついでにやれば許容範囲じゃないでしょうか。

Screen Shot 2015-06-29 at 4.05.58 PM.png

外部参照リンク形式で記述し、末尾のものがプログラムでパースする対象となります。

[ライブラリ名]:ライセンスURL となっているのが肝です( ´・‿・`)


プログラム実行

以下のコマンドで、output_dirにライセンスのplistファイル群が出力されます。

ios-license-generator generate [License.md] [output_dir] 


  • 一覧: LicenseList.plist

  • ライセンス詳細: ライブラリ名.plist


    • こちらはライブラリの数だけ生成されます




iOSアプリソースに配置

Settings.bundleが無い場合は適当に用意してください。

そして、生成されたファイル群をSettings.bundleに放り込みます。

(上述の[output_dir]で直接指定すればこの手順不要です。)

初回のみ、以下の手順も必要です。

Root.plistに以下を追加してください。

<dict>

<key>Type</key>
<string>PSChildPaneSpecifier</string>
<key>Title</key>
<string>License</string>
<key>File</key>
<string>LicenseList</string>
</dict>

国際化必要な場合、Root.stringsに以下を追加してください。

"License" = "ライセンス情報";