我的 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 上似乎都这样做)。
虽然我正在努力实现同样的目标;我似乎需要逐行拆分文本并一次一行地输入 xcode(并且 xcode4 在编辑 plist 时似乎有崩溃问题)。
这似乎是那种几乎肯定有某个地方的脚本可以做的事情,或者我错过的一些简单的方法。
最佳答案
我想我现在已经设法解决了我遇到的所有问题。
- 似乎最好使用组元素标题来持有许可证(这是 Apple 在 iWork 应用程序中所做的)。但是,这些文件的长度是有限制的(我还没有发现具体的限制是什么),所以您需要将每个许可证文件分成多个字符串。
- 您可以通过包含文字回车符(即,也称为 ^M、\r 或 0x0A)在其中创建换行符
- 确保不要在中间文本中包含任何文字 "。如果这样做,文件中的部分或全部字符串将被静默忽略。
我有一个方便的脚本来帮助生成 .plist 和 .strings 文件,如下所示。
使用方法:
- 在您的项目下创建一个“licenses”目录
- 将脚本放入该目录
- 将每个许可证放入该目录,每个文件一个,文件名以 .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
。您需要添加一个新部分,其中的键是 Array
类型的 Preference Items
。添加以下信息:
Filename
键指向由此脚本创建的 plist。您可以将 title
更改为您想要的任何内容。
在构建时执行脚本
此外,如果您希望此脚本在您构建项目时运行,您可以向目标添加构建阶段:
- 转到您的项目文件
- 选择目标
- 点击构建阶段选项卡
- 在该 Pane 的右下角,单击“添加构建阶段”
- 选择“添加运行脚本”
- 将您的 perl 脚本拖放到您的脚本部分。修改成如下所示:
cd $SRCROOT/licenses
($SRCROOT
points to the root of your project)./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);
}
关于ios - 将许可证部分添加到 iOS 设置包的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6428353/