Думаю, теперь мне удалось решить все проблемы, с которыми я столкнулся.
- Кажется, лучше всего использовать заголовки элементов группы для хранения лицензий (это то, что Apple делает в приложениях iWork). Однако существует ограничение на их длину (и я еще не выяснил, какой именно предел), поэтому вам нужно разбить каждый файл лицензии на несколько строк.
- Вы можете создать в них разрыв строки, включив буквальный возврат каретки (т. Е. Иначе известный как ^ M, \ r или 0x0A)
- Убедитесь, что не добавили какой-либо литерал в середине текста. Если вы это сделаете, некоторые или все строки в файле будут игнорироваться.
У меня есть удобный сценарий, который я использую для создания файлов .plist и .strings, показанных ниже.
Чтобы использовать это:
- Создайте каталог лицензий в рамках вашего проекта
- Поместите скрипт в этот каталог
- Поместите каждую лицензию в этот каталог, по одной на файл, с именами файлов, заканчивающимися .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
Если вы не создали файл Settings.bundle, перейдите в File -> New -> New File ...
В разделе "Ресурсы" найдите "Набор настроек". Используйте имя по умолчанию и сохраните его в корне вашего проекта.
Разверните Settings.bundleгруппу и выберите Root.plist. Вам нужно будет добавить новый раздел, в котором будет Preference Itemsтип ключа Array. Добавьте следующую информацию:

В Filenameключевые моменты к PLIST , который был создан этот сценарий. Вы можете изменить его titleна то, что захотите.
Выполнить скрипт во время сборки
Кроме того, если вы хотите, чтобы этот сценарий запускался всякий раз, когда вы строите свой проект, вы можете добавить этап сборки к своей цели:
- Перейдите в файл вашего проекта
- Выберите цель
- Щелкните вкладку Build Phases.
- В правом нижнем углу этой панели нажмите «Добавить этап сборки».
- Выберите «Добавить сценарий запуска».
- Перетащите ваш Perl-скрипт в раздел для вашего скрипта. Измените, чтобы выглядеть примерно так:
cd $SRCROOT/licenses( $SRCROOTуказывает на корень вашего проекта)
./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);
}