読者です 読者をやめる 読者になる 読者になる

iOSの設定画面にアプリのライセンスを置く

ios

WWDCのアプリが設定画面にライセンスを置いていて「じゃあそうしよう」みたいな話になったので調べた。

Settings.bundleとRoot.plistを用意

まずはSettings.bundleってファイルを作れば良くって、その作り方はググるとすぐ出てくる。
具体的には「New File > Resource > Settings Bundle」でOK。
で、そのBundleのディレクトリの下に以下のような内容の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>License</string>
                        <key>File</key>
                        <string>Acknowledgements</string>
                </dict>
        </array>
</dict>
</plist>

Acknowledgements.plistを作る

上で作ったRoot.plistはAcknowledgements.plistを読むような設定になっている(Acknowledgements)ので、Acknowledgements.plistにライセンスをつらつら書けば良い。

で、例えば既に「Acknowledgement.txt」がResourcesディレクトリにあるとして、
以下のようなscriptをResourcesディレクトリに置いて叩けばAcknowledgements.plistが作れる(「Resourcesディレクトリにscript置くのはどうなの?」という疑問は置いておく)

#!perl
use strict;
use warnings;
use FindBin;

my $input = shift || "$FindBin::Bin/Acknowledgement.txt";
my $output = "$FindBin::Bin/Settings.bundle/Acknowledgements.plist";

open my $rfh, '<', $input or die "cannot open $input: $!";
my $license = do { local $/; <$rfh> };
close $rfh;

my $template = do { local $/; <DATA> };

my $plist = sprintf($template, $license);

open my $wfh, '>', $output or die "cannot open $output: $!";
print {$wfh} $plist;
close $wfh;

__DATA__
<?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>Acknowledgements</string>
        <key>PreferenceSpecifiers</key>
        <array>
                <dict>
                        <key>Type</key>
                        <string>PSGroupSpecifier</string>
                        <key>Title</key>
                        <string>%s</string>
                </dict>
        </array>
</dict>
</plist>

実際に「Resources/Settings.bundle/Acknowledgements.plist」が作成されていればOK。