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

Jos*_*phH 114 plist ios 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.
Run Code Online (Sandbox Code Playgroud)

将这些信息置于设置包中的"许可"子条目下似乎有一个合理的先例(在ipad facebook,页面,主题演讲,数字和wikipanion上似乎都这样做).

我努力实现同样的努力; 我似乎需要逐行拆分文本并一次输入xcode一行(并且xcode4在编辑plist时似乎有崩溃问题).

看起来几乎可以肯定是某个地方要做的事情,或者是我错过了一些简单的方法.

Jos*_*phH 192

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

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

我有一个方便脚本,用于帮助生成.plist和.strings文件,如下所示.

要使用它:

  1. 在项目下创建"许可证"目录
  2. 将脚本放入该目录
  3. 将每个许可证放入该目录,每个文件一个,文件名以.license结尾
  4. 对许可证执行任何必要的重新格式化.(例如,删除行开头的多余空格,确保段落中没有换行符).每个段落之间应该有一个空行
  5. 切换到许可证目录并运行脚本
  6. 编辑您的设置捆绑Root.plist以包含名为"Acknowledments"的子部分

这是脚本:

#!/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);
Run Code Online (Sandbox Code Playgroud)

设置您的Settings.bundle

如果您尚未创建Settings.bundle,请转到文件 - >新建 - >新建文件...

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

展开Settings.bundle组并选择Root.plist.您需要添加一个新的部分,其中键Preference Items的类型Array.添加以下信息:

在此输入图像描述

Filename关键点,是由该脚本创建的plist中.您可以将其更改为title您想要的任何内容.

在构建时执行脚本

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

  1. 转到您的项目文件
  2. 选择目标
  3. 单击"构建阶段"选项卡
  4. 在该窗格的右下角,单击"添加构建阶段"
  5. 选择"添加运行脚本"
  6. 将perl脚本拖放到脚本部分.修改看起来像这样:
  1. cd $SRCROOT/licenses($SRCROOT指向项目的根目录)
  2. ./yourScriptName.pl

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

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);
}
Run Code Online (Sandbox Code Playgroud)

  • 这太棒了,谢谢.我在运行脚本块中使用了'cd"$ SRCROOT/Licenses /"',如果你有多个人在一个项目上工作,它会更好一些. (10认同)
  • 需要注意的一件事是:"文件名"是密钥的显示形式.实际的密钥是"文件".如果子窗格未显示,请右键单击并选择"显示原始键/值",并确保键名为"文件". (9认同)
  • 如果您使用iOS7,请阅读https://devforums.apple.com/message/894791#894791.具体来说,您可能需要将<key> Title </ key>更改为<key> FooterText </ key>以使其看起来正常. (9认同)
  • 这是我以前手动做的事情.感谢您发布此内容! (2认同)
  • 如何使其成为子窗格:在"首选项"中创建项目0.看起来您不能选择子窗格作为类型,但您要做的是在项目0(项目0的子项目)下创建项目,并且第一项目具有键"类型".要简化操作,请右键单击此选项并选择"显示原始键/值".您希望将Type的值设置为PSChildPaneSpecifier.一旦取消设置显示原始键/值,它现在将显示子窗格,即使在项目0的名称中,即"其0(子窗格 - )".这就是你想要的. (2认同)

Sea*_*ean 36

这是@JosephH提供的相同解决方案(没有翻译),但是在Python中为任何喜欢python over perl的人完成

import os
import sys
import plistlib
from copy import deepcopy

os.chdir(sys.path[0])

plist = {'PreferenceSpecifiers': [], 'StringsTable': 'Acknowledgements'}
base_group = {'Type': 'PSGroupSpecifier', 'FooterText': '', 'Title': ''}

for filename in os.listdir("."):
    if filename.endswith(".license"):
        current_file = open(filename, 'r')
        group = deepcopy(base_group)
        title = filename.split(".license")[0]
        group['Title'] = title
        group['FooterText'] = current_file.read()
        plist['PreferenceSpecifiers'].append(group)

plistlib.writePlist(
    plist,
    "../Settings.bundle/Acknowledgements.plist"
)
Run Code Online (Sandbox Code Playgroud)

  • 对于unicode许可证,`current_file = codecs.open(filename,'r','utf-8')`. (4认同)

Jos*_*phH 15

作为替代方案,对于那些使用CocoaPods的人,它将为Podfile中指定的每个目标生成一个"Acknowledgements"plist,其中包含该目标中使用的每个Pod的许可证详细信息(假设已在Pod规范中指定了详细信息).可以添加到iOS设置包的属性列表文件.

还有正在进行的项目允许在应用程序中转换和显示此数据:

https://github.com/CocoaPods/cocoapods-install-metadata

https://github.com/cocoapods/CPDAcknowledgements

  • 以下是有关它的更多信息:https://github.com/CocoaPods/CocoaPods/wiki/Acknowledgements (3认同)

car*_*loe 14

我以为我会把我的迭代扔在Sean的混合中很棒的python代码上.主要区别在于它需要一个输入目录,然后以递归方式搜索它以获取LICENSE文件.它从LICENSE文件的父目录派生标题值,因此它可以很好地与cocoapods一起使用.

我的动机是创建一个构建脚本,以便在我添加或删除pod时自动保持我的应用程序的合法部分是最新的.它还执行其他一些操作,例如从许可证中删除强制换行符,以便段落在设备上看起来更好一些.

https://github.com/carloe/LicenseGenerator-iOS

在此输入图像描述


cvk*_*age 8

我在Ruby编写了一个由@JosephH脚本激发的脚本.在我看来,这个版本将更好地代表各个开源项目.

Wisit iOS-AcknowledgementGenerator下载脚本和示例项目.

这是您的应用程序中的确认:

Settings.app Settings.bundle 致谢 在此输入图像描述