将许可部分添加到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文件,如下所示。
要使用它:
- 在您的项目下创build一个“许可证”目录
- 将脚本放入该目录
- 将每个许可证放入该目录中,每个文件一个,文件名以.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
如果你还没有创build一个Settings.bundle,转到文件 – >新build – >新build文件…
在Resource部分下,findSettings Bundle。 使用默认名称并将其保存到项目的根目录下。
展开Settings.bundle
组并selectRoot.plist
。 您将需要添加一个新的部分,其中的关键将是Array
types的Preference Items
。 添加以下信息:
Filename
键指向由此脚本创build的plist。 您可以将title
更改为任何您想要的。
在构build时执行脚本
另外,如果您希望在构build项目时运行此脚本,则可以将构build阶段添加到目标中:
- 转到您的项目文件
- select目标
- 点击Build Phases选项卡
- 在该窗格的右下angular,点击“添加生成阶段”
- select“添加运行脚本”
- 将您的perl脚本拖放到脚本的部分。 修改看起来像这样:
cd $SRCROOT/licenses
($SRCROOT
指向您项目的根目录)./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设置包的属性列表文件。
还有一些项目正在进行中,以便将这些数据转换并显示在应用程序中:
我用@JosephH脚本激发了Ruby的脚本。 这个版本在我看来会更好地代表个别的开源项目。
Wisit iOS-AcknowledgementGenerator下载脚本和示例项目。
这是您的应用程序中的确认内容:
我以为我会把自己的精力放在Sean真棒Python代码上。 主要区别在于它需要一个input目录,然后recursionsearchLICENSE文件。 它从LICENSE文件的父目录派生标题值,所以它可以和cocoapods一起玩。
动机是创build一个构build脚本,以自动保持我的应用程序的合法部分是最新的,因为我添加或删除豆荚。 它还做了一些其他的事情,如从许可证中删除强制换行符,以使段落在设备上看起来更好一些。
这是JosephH答案的附录。 (我没有代表评论)
我必须将<key>StringsTable</key> <string>Acknowledgements</string>
移动到Perl脚本的最后</dict>
之上。
在此修改之前,应用程序中的致谢部分是空的,XCode无法读取得到的Acknowledgements.plist。 (“数据无法被读取,因为它的格式不正确。”)
(XCode 6.3.2 iOS 8.3)
这个线程中的Sean的Python脚本起作用。 但有几个基本的东西要知道。
- 在Xcode中,右键单击项目导航器树顶部的项目名称,然后添加一个新组。 这会在您的项目中添加一个新的文件夹。
- 在那里添加Sean的脚本,并确保将其保存为:Acknowledgements.py。
- 确保你的系统上安装了Python。 我正在使用Mac。
- 将第一个许可证文件添加到您在1中创build的文件夹中。使之简单,就像文件中只有一个词一样,说:testing。 将其作为Test1.license保存在文件夹中。
- 根据上面的JosephH设置您的Settings.bundle。
- 使用您的terminal应用程序光盘到您在1中创build的文件夹。
- 运行脚本。 input:python Acknowledgements.py。 如果没有错误,它将返回到terminal提示符。 在将任何运行脚本添加到Build之前执行所有这些操作。
- 构build并运行您的应用程序。
- 双击iPhone主页button并杀死设置。 在设置重新启动之前,它不会经常为您的应用程序启动“设置”更改。
- 重新启动设置后,转到您的应用程序,看看它是否工作。
- 如果这一切奏效,缓慢添加更多的许可证文件,但每次运行脚本。 由于文件中的特定字符,您可能会遇到运行脚本的错误,因此debugging的简单方法是添加文件,运行脚本,查看它是否工作并继续。 否则,编辑.license文件中的任何特殊字符。
- 按照上面的说明,我没有运行构build脚本。 但是如果你不经常更改.license文件,这个过程就可以正常工作。