Myślę, że teraz udało mi się rozwiązać wszystkie napotkane problemy.
- Wydaje się, że najlepiej jest używać tytułów elementów grupowych do przechowywania licencji (tak robi Apple w aplikacjach iWork). Istnieje jednak ograniczenie ich długości (a jeszcze nie odkryłem dokładnie, jaki to limit), więc musisz podzielić każdy plik licencji na wiele ciągów.
- Możesz w nich utworzyć podział wiersza, dołączając literalny znak powrotu karetki (np. Znany jako ^ M, \ r lub 0x0A)
- Upewnij się, że nie zawiera żadnego tekstu pośredniego dosłownego. Jeśli to zrobisz, niektóre lub wszystkie ciągi w pliku zostaną po cichu zignorowane.
Mam wygodny skrypt, którego używam do generowania plików .plist i .strings, pokazanych poniżej.
Aby z niego skorzystać:
- Utwórz katalog „Licencje” w swoim projekcie
- Umieść skrypt w tym katalogu
- Umieść każdą licencję w tym katalogu, po jednej na plik, z nazwami plików kończącymi się na .license
- Przeprowadź niezbędne ponowne formatowanie licencji. (np. usuń dodatkowe spacje na początku wierszy, upewnij się, że w środku akapitu nie ma podziałów). Pomiędzy każdym akapitem powinna znajdować się pusta linia
- Przejdź do katalogu licencji i uruchom skrypt
- Edytuj pakiet ustawień Root.plist, aby uwzględnić sekcję podrzędną o nazwie „Podziękowania”
Oto scenariusz:
#!/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);
Konfigurowanie pakietu Settings.bundle
Jeśli nie utworzyłeś pakietu ustawień, przejdź do Plik -> Nowy -> Nowy plik ...
W sekcji Zasoby znajdź pakiet ustawień. Użyj domyślnej nazwy i zapisz ją w katalogu głównym projektu.
Rozwiń Settings.bundle
grupę i wybierz Root.plist
. Będziesz musiał dodać nową sekcję, w której jej klucz będzie Preference Items
typu Array
. Dodaj następujące informacje:
Do Filename
kluczowych punktów do plist, który został utworzony przez ten skrypt. Możesz zmienić title
to, co chcesz.
Wykonaj skrypt w czasie kompilacji
Ponadto, jeśli chcesz, aby ten skrypt był uruchamiany za każdym razem, gdy tworzysz projekt, możesz dodać fazę kompilacji do celu:
- Przejdź do pliku projektu
- Wybierz cel
- Kliknij kartę Fazy budowy
- W prawym dolnym rogu tego panelu kliknij „Dodaj fazę budowy”
- Wybierz „Dodaj skrypt uruchamiania”
- Przeciągnij i upuść skrypt perla do sekcji skryptu. Zmodyfikuj, aby wyglądać mniej więcej tak:
cd $SRCROOT/licenses
( $SRCROOT
wskazuje na katalog główny twojego projektu)
./yourScriptName.pl
Po zakończeniu możesz wcześniej przeciągnąć Run Script
fazę kompilacji w procesie kompilacji. Będziesz chciał go wcześniej przenieść, Compile Sources
aby aktualizacje pakietu ustawień zostały skompilowane i skopiowane.
Aktualizacja dla iOS 7: iOS 7 wydaje się obsługiwać klawisz „Tytuł” inaczej i psuje renderowany tekst. Aby naprawić, że wygenerowana lista Acknowledgements.plist musi używać klucza „FooterText” zamiast „Title”. Oto jak zmienić skrypt:
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);
}