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