くま's Tech系Blog

基本的には技術で学んだことを書き留めようと思います。雑談もやるかもね!

iOSアプリでライセンス表示機能を作る

今回はライセンス機能についてです。

OSSのライブラリをiOSのアプリで利用している場合、使用したライブラリのライセンスをしかるべき場所に記載する必要があります。

ライブラリを追加する度にそれらを手動で更新すると手間になるので、それらをCocoaPodsの仕組みを使いながら自動で更新するようにしたいと思います。

Settings.bundleの作成

Settings.bundleという仕組みを使うことで、簡単にアプリの設定画面を実装することができます。

今回はSettings.bundleを使ってアプリの設定画面を実装し、その中にAcknowledgement(謝辞、ライセンス情報)を表示するようにしたいと思います。

さっそくSettings.bundleを作ってみます。Projectフォルダを右クリックし、 New FileのオプションからSettings Bundleを選択し、ファイルを作成してください。

f:id:kumaskun:20210425163754p:plain

Settings.bundleができたら、その中にあるRoot.plistを書き換えます。

Root.plistはアプリの設定に表示させる項目を設定するファイルです。

Root.plistを右クリックし、Open as > Source Code を選択してください。

下記は一例ですが、下記のように修正してください。

<?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>PSGroupSpecifier</string>
            <key>Title</key>
            <string>Group</string>
        </dict>
        <dict>
             <key>Title</key>
             <string>About</string>
             <key>Type</key>
             <string>PSGroupSpecifier</string>
             <key>FooterText</key>
             <string>Copyright © 2021 sample All Rights Reserved.</string>
         </dict>
         <dict>
             <key>Type</key>
             <string>PSTitleValueSpecifier</string>
             <key>DefaultValue</key>
             <string>1.0.0</string>
             <key>Title</key>
             <string>Version</string>
             <key>Key</key>
             <string>sbVersion</string>
         </dict>
         <dict>
             <key>Type</key>
             <string>PSChildPaneSpecifier</string>
             <key>Title</key>
             <string>Acknowledgements</string>
             <key>File</key>
             <string>Acknowledgements</string>
         </dict>
    </array>
</dict>
</plist>

FooterTextはその名の通り、Footerに表示させる機能で、Versionはバージョンを表示させる機能、Acknowledgementsは謝辞を表示させるためにあります。

続いて、ライセンス用のplistファイルを作成します。

Settings.bundle配下にAcknowledgement.plistを作成します。

Projectのフォルダーを右クリックしNew FileからProperty Listを作成してください。名前はAcknowledgements.plistで いいと思います。

f:id:kumaskun:20210425164639p:plain

作成したら、そのファイルをSettings.bundleの配下に移動させておきましょう。

CocoaPodsによるAcknowledgementsの書き出し

次に、CocoaPodsからOSSのライセンスの情報を直接書き出します。

PodFileに下記設定を追加しましょう。

post_install do | installer |
  require 'fileutils'
  FileUtils.cp_r('Pods/Target Support Files/Pods-(プロジェクト名)/Pods-(プロジェクト名)-acknowledgements.plist', '(Acknowledgements.plistのパス)', :remove_destination => true)
end

上記の設定を追加することでpod installやpod updateでライブラリの更新があった場合に変更が反映されます。

pod installやpod updateを行うことで、Acknowledgements.plistにライセンス情報が格納されます。

上記の設定が終われば、アプリをビルドするとアプリの設定画面から今回の設定した項目が確認できます。

アプリの設定に表示させたくない場合には該当のタグの中身を削除しましょう

アプリの中でライセンスを表示させる場合にはAcknowledgements.plistからライセンスの情報を取得すれば可能です。

Acknowledgements.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>PreferenceSpecifiers</key>
        <array>
            <dict>
                <key>FooterText</key>
                <string>○○○○○○○○○○○○○○○○○○○○○○</string>
                <key>License</key>
                <string>MIT</string>
                <key>Title</key>
                <string>○○○○○○</string>
                <key>Type</key>
                <string>PSGroupSpecifier</string>
            </dict>
        </array>
    </dict>
</plist>

FooterTextがライセンス表記、Licenseがライセンス種類、Titleがライブラリ名となります。

info.plistから情報を取得するのと同じようにタグの情報を取得して画面に表示させることが可能です。

if let path = Bundl.url(foeResource: "Acknowledgements", withExtension: "plist", subdirectory: nil, in: Bundle.main.url(forResource: "Settings", withExtensions: "bundle")!) {

    var items: [Any] = []
    
    let acknowledgements = NSDictionary(contentsOf: path)!
    items = acknowledgements["PreferenceSpecifiers"] as! [Any]

    items.removeFirst()
    items.removeLast()
}

removeFirst()とremoveLast()をしているのは最初と最後には関係のない情報が入っているためです。

最後に

ここまでライセンス表記の方法について説明しましたが、LicensePlistというライブラリで実現する方が便利かもしれません。

github.com