Думаю, теперь мне удалось решить все проблемы, с которыми я столкнулся.
- Кажется, лучше всего использовать заголовки элементов группы для хранения лицензий (это то, что 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);
}