我想我现在已经设法解决了我遇到的所有问题。
- 似乎最好使用组元素标题来持有许可证(这是 Apple 在 iWork 应用程序中所做的)。但是,它们的长度是有限制的(我还没有确切地发现限制是什么),因此您需要将每个许可证文件分成多个字符串。
- 您可以通过包含文字回车(即,也称为 ^M、\r 或 0x0A)在其中创建换行符
- 确保不要包含任何文字 "s 中间文本。如果这样做,文件中的部分或全部字符串将被静默忽略。
我有一个方便的脚本用来帮助生成 .plist 和 .strings 文件,如下所示。
要使用它:
- 在您的项目下创建一个“许可证”目录
- 将脚本放入该目录
- 将每个许可证放入该目录,每个文件一个,文件名以 .license 结尾
- 对许可证执行任何必要的重新格式化。(例如,删除行首的多余空格,确保段落中间没有换行符)。每个段落之间应该有一个空行
- 切换到 licenses 目录并运行脚本
- 编辑您的设置包 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,请转到 File --> New --> New File...
在资源部分下,找到设置包。使用默认名称并将其保存到项目的根目录。
展开Settings.bundle
组并选择Root.plist
。您将需要添加一个新部分,其键Preference Items
类型为Array
。添加以下信息:

Filename
关键点指向此脚本创建的 plist 。你可以改变title
任何你想要的。
在构建时执行脚本
此外,如果您希望在构建项目时运行此脚本,您可以向目标添加构建阶段:
- 转到您的项目文件
- 选择目标
- 单击构建阶段选项卡
- 在该窗格的右下角,单击“添加构建阶段”
- 选择“添加运行脚本”
- 将您的 perl 脚本拖放到您的脚本部分。修改为如下所示:
cd $SRCROOT/licenses
($SRCROOT
指向项目的根目录)
./yourScriptName.pl
完成后,您可以Run Script
在构建过程中更快地拖动构建阶段。您需要先将其向上移动,Compile Sources
以便对 Settings Bundle 的更新进行编译和复制。
iOS 7 的更新: iOS 7 似乎处理不同的“标题”键并且弄乱了呈现的文本。要修复生成的 Acknowledgements.plist 需要使用“FooterText”键而不是“Title”。这是如何更改脚本:
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);
}