ios - 将许可证部分添加到 iOS 设置包的最佳方法

标签 ios plist settings.bundle

我的 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 文件,如下所示。

使用方法:

  1. 在您的项目下创建一个“licenses”目录
  2. 将脚本放入该目录
  3. 将每个许可证放入该目录,每个文件一个,文件名以 .license 结尾
  4. 对许可证执行任何必要的重新格式化。 (例如,删除行首的多余空格,确保段落中间没有换行符)。每段之间应有一个空行
  5. 切换到许可目录并运行脚本
  6. 编辑您的设置包 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。添加以下信息:

enter image description here

Filename 键指向由此脚本创建的 plist。您可以将 title 更改为您想要的任何内容。

在构建时执行脚本

此外,如果您希望此脚本在您构建项目时运行,您可以向目标添加构建阶段:

  1. 转到您的项目文件
  2. 选择目标
  3. 点击构建阶段选项卡
  4. 在该 Pane 的右下角,单击“添加构建阶段”
  5. 选择“添加运行脚本”
  6. 将您的 perl 脚本拖放到您的脚本部分。修改成如下所示:
  1. cd $SRCROOT/licenses ($SRCROOT points to the root of your project)
  2. ./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/

相关文章:

ios - 将参数传递给 dispatch_async

ios - 无法打开使用 AFNetworking 的旧 iOS 项目

ios - 多线程违规留给我们的只是荣誉(失败)

xcode - Xcode-如何使其对同一代码库,不同目标使用不同的plist文件

ios - 在iOS程序中读取plist

iphone - 多值类型设置捆绑字段始终返回 null

iphone - 如何从 JSON 数据请求访问 NSDictionary 的内容

ios - 将 IOS 中的应用程序功能限制为仅使用 Cell/WiFi 数据。

settings.bundle - ios13 设置捆绑与子 Pane 在真实设备上崩溃 Settings.app

ios - 设置包 - 如何删除它