私の iOS アプリケーションは、Apache 2.0 および類似のライセンスでライセンスされたサードパーティ コンポーネントを多数使用しており、次のようなさまざまなテキストを含める必要があります。
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
この情報を設定バンドルの「ライセンス」サブエントリの下に置くという合理的な前例があるようです (iPad の Facebook、Pages、Keynote、Numbers、Wikipanion はすべてこれを実行しているようです)。
ただし、実際に同じことを実現するには少し苦労しています。テキストを 1 行ずつ分割し、一度に 1 行ずつ Xcode に入力する必要があるようです (また、xcode4 では plist を編集するときにクラッシュする問題があるようです)。
これは、どこかに実行できるスクリプトがあるか、または私が見逃している簡単な方法があるような類のもののように思えます。
ベストアンサー1
これまで遭遇していた問題はすべて解決できたと思います。
- ライセンスを保持するには、グループ要素のタイトルを使用するのが最適なようです (これは Apple が iWork アプリで行っていることです)。ただし、これらの長さには制限があります (制限が正確にどれくらいかはまだわかりません)。そのため、各ライセンス ファイルを複数の文字列に分割する必要があります。
- これらの中に改行を作成するには、リテラルのキャリッジリターン(つまり、^M、\r、または0x0Aとも呼ばれます)を含めます。
- テキストの途中にリテラルの「s」を含めないようにしてください。含めると、ファイル内の文字列の一部またはすべてが暗黙的に無視されます。
以下に示すような、.plist ファイルと .strings ファイルの生成に役立つ便利なスクリプトがあります。
使用するには:
- プロジェクトの下に「licenses」ディレクトリを作成します
- そのディレクトリにスクリプトを置く
- 各ライセンスを、ファイルごとに 1 つずつ、ファイル名の末尾が .license となるようにディレクトリに配置します。
- ライセンスの必要な再フォーマットを実行します。(例: 行頭の余分なスペースを削除し、段落の途中で改行がないことを確認します)。各段落の間には空白行が必要です。
- ライセンスディレクトリに移動してスクリプトを実行します
- 設定バンドルの Root.plist を編集して、「Acknowledgements」という子セクションを追加します。
スクリプトは次のとおりです。
#!/usr/bin/perl -w
use strict;
my $out = "../Settings.bundle/en.lproj/Acknowledgements.strings";
my $plistout = "../Settings.bundle/Acknowledgements.plist";
unlink $out;
open(my $outfh, '>', $out) or die $!;
open(my $plistfh, '>', $plistout) or die $!;
print $plistfh <<'EOD';
<?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>
EOD
for my $i (sort glob("*.license"))
{
my $value=`cat $i`;
$value =~ s/\r//g;
$value =~ s/\n/\r/g;
$value =~ s/[ \t]+\r/\r/g;
$value =~ s/\"/\'/g;
my $key=$i;
$key =~ s/\.license$//;
my $cnt = 1;
my $keynum = $key;
for my $str (split /\r\r/, $value)
{
print $plistfh <<"EOD";
<dict>
<key>Type</key>
<string>PSGroupSpecifier</string>
<key>Title</key>
<string>$keynum</string>
</dict>
EOD
print $outfh "\"$keynum\" = \"$str\";\n";
$keynum = $key.(++$cnt);
}
}
print $plistfh <<'EOD';
</array>
</dict>
</plist>
EOD
close($outfh);
close($plistfh);
Settings.bundle の設定
Settings.bundle を作成していない場合は、[ファイル] --> [新規] --> [新しいファイル...] に移動します。
リソース セクションで、設定バンドルを見つけます。デフォルトの名前を使用して、プロジェクトのルートに保存します。
グループを展開してSettings.bundle
を選択します。キーが型にRoot.plist
なる新しいセクションを追加する必要があります。次の情報を追加します。Preference Items
Array
キーFilename
は、このスクリプトによって作成された plist を指します。 をtitle
任意のものに変更できます。
ビルド時にスクリプトを実行する
また、プロジェクトをビルドするたびにこのスクリプトを実行する場合は、ターゲットにビルド フェーズを追加できます。
- プロジェクトファイルに移動します
- ターゲットを選択
- ビルドフェーズタブをクリックします
- そのペインの右下隅にある「ビルドフェーズの追加」をクリックします。
- 「実行スクリプトの追加」を選択します
- Perl スクリプトをスクリプトのセクションにドラッグ アンド ドロップします。次のように変更します。
cd $SRCROOT/licenses
($SRCROOT
プロジェクトのルートを指します)./yourScriptName.pl
それが終わったら、ビルド プロセスの早い段階でビルド フェーズをドラッグできます。設定バンドルの更新がコンパイルされ、コピーされるように、Run Script
ビルド フェーズを前に移動する必要があります。Compile Sources
iOS 7 のアップデート:iOS 7 は「タイトル」キーを異なる方法で処理しているようで、レンダリングされたテキストがおかしくなります。これを修正するには、生成された Acknowledgements.plist で「タイトル」ではなく「FooterText」キーを使用する必要があります。スクリプトを変更する方法は次のとおりです。
for my $str (split /\r\r/, $value)
{
print $plistfh <<"EOD";
<dict>
<key>Type</key>
<string>PSGroupSpecifier</string>
<key>FooterText</key> # <= here is the change
<string>$keynum</string>
</dict>
EOD
print $outfh "\"$keynum\" = \"$str\";\n";
$keynum = $key.(++$cnt);
}