我的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、页面、keynote、数字和wikipanion似乎都可以这样做).

不过,我正在努力实现同样的效果;我似乎需要逐行拆分文本,然后一次一行地输入Xcode(而xcode4在编辑plist时似乎有崩溃问题).

这似乎是一种几乎肯定有一个地方脚本要做的事情,或者一些我错过的简单方法.

推荐答案

我想我现在已经设法解决了我遇到的所有问题.

  • 似乎最好使用组元素标题来持有许可证(这就是苹果在iWork应用程序中所做的).但是,这些文件的长度是有限制的(我还没有发现确切的限制是什么),因此您需要将每个许可证文件拆分为多个字符串.
  • 您可以通过包含文字回车符(即,也称为^M、\r或0x0A)在这些字符中创建换行符
  • 确保不包括任何文字的中间文本.如果这样做,文件中的部分或全部字符串将被静默忽略.

我有一个方便的脚本,用来帮助生成.普利斯特和.字符串文件,如下所示.

要使用它,请执行以下操作:

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

If you haven't created a Settings.bundle, go to File --> New --> New File...

在资源部分下,找到设置包.使用默认名称并将其保存到项目的根目录中.

展开Settings.bundle组并 Select Root.plist.您需要添加一个新节,其中它的键将是类型ArrayPreference Items.添加以下信息:

在此处输入图像描述

此脚本创建的plist的Filename个关键点.你可以把title换成任何你想要的.

在构建时执行脚本

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

  1. 转到您的项目文件
  2. Select 目标
  3. 单击构建阶段选项卡
  4. 在该窗格的右下角,单击"添加构建阶段"
  5. Select "添加运行脚本"
  6. 将Perl脚本拖放到脚本对应的部分.将其修改为如下所示:
  1. cd $SRCROOT/licenses($SRCROOT指向项目的根目录)
  2. ./yourScriptName.pl

完成后,可以在构建过程中更快地拖动Run Script构建阶段.您需要将其在Compile Sources之前上移,以便对设置包的更新进行编译和复制.

Update for iOS 7:iOS7似乎对"title"键的处理有所不同,并且弄乱了呈现的文本.要解决生成的Acknowgements.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相关问答推荐

如何在进行滑动删除操作时保持自定义视图背景静态

我想在expo 中使用useSafeAreaInsets来获取paddingbottom,但我得到了一个错误

无法在所有窗口上方显示图像

使用AVCaptureEventInteraction捕获音量按键快门

如何将模糊输入/模糊输出添加到SwiftUI中的非对称过渡?

在flatter_riverpod中,如果没有ref对象,我们如何访问提供程序?

仅更改 AttributedString 的字符串(例如 UIButton 配置 attributeTitle)

比较 `某个协议` 实例时出现编译错误

如何在 SwiftUI 中通过通用 @ObservedObject 进行切换?

DllImport with .a file for iOS in MAUI

无法在 CollectionView 中禁用部分弹跳 - 组合布局

CGPath intersection(_:using:) 和朋友(iOS 16 中的新功能)坏了?

发生异常:需要 issuerId

缺少推送通知权利

如何设置imageView的圆角半径?

如何在 Xcode 4 中切换 .h 和 .m

判断密钥是否存在于 NSDictionary 中

IOS - 从 UITextView 中删除所有填充

正确使用 Alamofire 的 URLRequestConvertible

UITableView 中的圆形 UIImageView 没有性能影响?