我想我现在已经设法解决了遇到的所有问题。
- 似乎最好使用组元素标题来持有许可证(这是Apple在iWork应用程序中所做的事情)。但是,它们的长度是有限制的(并且我还没有确切发现限制是什么),因此您需要将每个许可证文件分成多个字符串。
- 您可以通过在其中包含换行符的方式来创建换行符(例如,以其他方式称为^ M,\ r或0x0A)
- 确保不包含任何文字中间文本。如果这样做,文件中的某些或所有字符串将被静默忽略。
我有一个便捷脚本,可用来帮助生成.plist和.strings文件,如下所示。
要使用它:
- 在您的项目下创建一个“许可证”目录
- 将脚本放入该目录
- 将每个许可证放入该目录(每个文件一个),文件名以.license结尾
- 对许可证执行任何必要的重新格式化。(例如,在行首删除多余的空格,确保段落中间没有换行符)。每个段落之间应有一个空白行
- 转到许可证目录并运行脚本
- 编辑设置包Root.plist,以包含一个名为“致谢”的子部分
这是脚本:
#!/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似乎处理“ Title”键的方式有所不同,并且使呈现的文本混乱。要修复生成的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);
}