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

我的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脸书,页面,主题演讲,数字和wikipanion似乎都是这样做的)。

尽pipe如此,我正在努力争取实现。 我似乎需要逐行分割文本,并一次inputxcode一行(在编辑plists时xcode4似乎有一个崩溃的问题)。

看起来好像是某种脚本可以做的事情,或者是我错过了的一些简单的方法。

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

  • 似乎最好使用组元素标题来保存许可证(这是苹果公司在iWork应用程序中所做的)。 但是,这些限制(我还没有发现到底是什么限制),所以你需要将每个许可证文件分成多个string。
  • 您可以通过包含一个文字回车符(即,否则称为^ M,\ r或0x0A)在这些内部创build一个换行符,
  • 确保不要包含任何文字的中间文本,如果这样做,文件中的某些或全部string将被默认忽略。

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

要使用它:

  1. 在您的项目下创build一个“许可证”目录
  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

如果你还没有创build一个Settings.bundle,转到文件 – >新build – >新build文件…

在Resource部分下,findSettings Bundle。 使用默认名称并将其保存到项目的根目录下。

展开Settings.bundle组并selectRoot.plist 。 您将需要添加一个新的部分,其中的关键将是Arraytypes的Preference Items 。 添加以下信息:

在这里输入图像描述

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

在构build时执行脚本

另外,如果您希望在构build项目时运行此脚本,则可以将构build阶段添加到目标中:

  1. 转到您的项目文件
  2. select目标
  3. 点击Build Phases选项卡
  4. 在该窗格的右下angular,点击“添加生成阶段”
  5. select“添加运行脚本”
  6. 将您的perl脚本拖放到脚本的部分。 修改看起来像这样:
  1. cd $SRCROOT/licenses$SRCROOT指向您项目的根目录)
  2. ./yourScriptName.pl

完成之后,可以在构build过程中尽快拖动“ Run Script构build阶段。 在Compile Sources之前,您需要先将其移动,以便对Settings Bundle的更新进行编译和复制。

更新为iOS 7: iOS 7似乎处理“标题”键不同,并搞乱了呈现文字。 要修复生成的Acknowledgements.plist需要使用“FooterText”键而不是“标题”。 这如何改变脚本:

 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); } 

这是@JosephH提供的相同的解决scheme(没有翻译),但在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" ) 

另外,对于那些使用CocoaPods的人来说,它将为您的Podfile中的每个目标生成一个“确认”plist,其中包含该目标中使用的每个Pod的许可证详细信息(假设Pod规范中已经指定了详细信息)。 可以添加到iOS设置包的属性列表文件。

还有一些项目正在进行中,以便将这些数据转换并显示在应用程序中:

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

https://github.com/cocoapods/CPDAcknowledgements

我用@JosephH脚本激发了Ruby的脚本。 这个版本在我看来会更好地代表个别的开源项目。

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

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

Settings.appSettings.bundle致谢在这里输入图像描述

我以为我会把自己的精力放在Sean真棒Python代码上。 主要区别在于它需要一个input目录,然后recursionsearchLICENSE文件。 它从LICENSE文件的父目录派生标题值,所以它可以和cocoapods一起玩。

动机是创build一个构build脚本,以自动保持我的应用程序的合法部分是最新的,因为我添加或删除豆荚。 它还做了一些其他的事情,如从许可证中删除强制换行符,以使段落在设备上看起来更好一些。

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

在这里输入图像描述

这是JosephH答案的附录。 (我没有代表评论)

我必须将<key>StringsTable</key> <string>Acknowledgements</string>移动到Perl脚本的最后</dict>之上。

在此修改之前,应用程序中的致谢部分是空的,XCode无法读取得到的Acknowledgements.plist。 (“数据无法被读取,因为它的格式不正确。”)

(XCode 6.3.2 iOS 8.3)

这个线程中的Sean的Python脚本起作用。 但有几个基本的东西要知道。

  1. 在Xcode中,右键单击项目导航器树顶部的项目名称,然后添加一个新组。 这会在您的项目中添加一个新的文件夹。
  2. 在那里添加Sean的脚本,并确保将其保存为:Acknowledgements.py。
  3. 确保你的系统上安装了Python。 我正在使用Mac。
  4. 将第一个许可证文件添加到您在1中创build的文件夹中。使之简单,就像文件中只有一个词一样,说:testing。 将其作为Test1.license保存在文件夹中。
  5. 根据上面的JosephH设置您的Settings.bundle。
  6. 使用您的terminal应用程序光盘到您在1中创build的文件夹。
  7. 运行脚本。 input:python Acknowledgements.py。 如果没有错误,它将返回到terminal提示符。 在将任何运行脚本添加到Build之前执行所有这些操作。
  8. 构build并运行您的应用程序。
  9. 双击iPhone主页button并杀死设置。 在设置重新启动之前,它不会经常为您的应用程序启动“设置”更改。
  10. 重新启动设置后,转到您的应用程序,看看它是否工作。
  11. 如果这一切奏效,缓慢添加更多的许可证文件,但每次运行脚本。 由于文件中的特定字符,您可能会遇到运行脚本的错误,因此debugging的简单方法是添加文件,运行脚本,查看它是否工作并继续。 否则,编辑.license文件中的任何特殊字符。
  12. 按照上面的说明,我没有运行构build脚本。 但是如果你不经常更改.license文件,这个过程就可以正常工作。