Я думаю, що мені зараз вдалося вирішити всі проблеми, з якими я стикався.
- Здається, найкраще використовувати заголовки групових елементів для зберігання ліцензій (це те, що 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, перейдіть до Файл -> Новий -> Новий файл ...
У розділі "Ресурси" знайдіть "Налаштування". Використовуйте ім'я за замовчуванням і збережіть його в корені проекту.
Розгорніть Settings.bundle
групу та виберіть Root.plist
. Вам потрібно буде додати новий розділ, де його ключ буде Preference Items
тип Array
. Додайте таку інформацію:
У Filename
ключові моменти до PLIST , який був створений цей сценарій. Ви можете змінити те, 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);
}