Saya rasa sekarang saya telah berhasil menyelesaikan semua masalah yang saya hadapi.
- Tampaknya lebih baik menggunakan judul elemen grup untuk memegang lisensi (inilah yang dilakukan Apple di aplikasi iWork). Namun ada batasan panjangnya (dan saya belum menemukan dengan tepat apa batasnya), jadi Anda perlu memecah setiap file lisensi menjadi beberapa string.
- Anda dapat membuat pemisah baris di dalamnya dengan menyertakan carriage return literal (misalnya, dikenal sebagai ^ M, \ r atau 0x0A)
- Pastikan untuk tidak menyertakan teks tengah literal. Jika Anda melakukannya, beberapa atau semua string dalam file akan diabaikan secara diam-diam.
Saya memiliki skrip praktis yang saya gunakan untuk membantu menghasilkan file .plist dan .strings, yang ditunjukkan di bawah ini.
Untuk menggunakannya:
- Buat direktori 'lisensi' di bawah proyek Anda
- Masukkan skrip ke direktori itu
- Letakkan setiap lisensi ke dalam direktori itu, satu per file, dengan nama file yang berakhiran .license
- Lakukan format ulang yang diperlukan pada lisensi. (mis. hapus spasi ekstra di awal baris, pastikan tidak ada jeda baris di tengah paragraf). Harus ada baris kosong di antara setiap paragraf
- Ubah ke direktori lisensi & jalankan skrip
- Edit paket pengaturan Anda Root.plist untuk menyertakan bagian anak yang disebut 'Ucapan Terima Kasih'
Berikut skripnya:
#!/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);
Menyiapkan Settings.bundle Anda
Jika Anda belum membuat Settings.bundle, buka File -> New -> New File ...
Di bawah bagian Resource, temukan Settings Bundle. Gunakan nama default dan simpan ke root proyek Anda.
Luaskan Settings.bundle
grup dan pilih Root.plist
. Anda perlu menambahkan bagian baru di mana kuncinya akan Preference Items
bertipe Array
. Tambahkan informasi berikut:
The Filename
poin kunci untuk plist yang telah dibuat oleh script ini. Anda dapat mengubah title
apa pun yang Anda inginkan.
Jalankan Skrip Pada Waktu Pembuatan
Selain itu, jika Anda ingin skrip ini berjalan setiap kali Anda membangun proyek, Anda dapat menambahkan fase pembangunan ke target Anda:
- Buka file proyek Anda
- Pilih target
- Klik tab Build Phases
- Di sudut kanan bawah panel itu, klik 'Tambahkan Fase Bangun'
- Pilih 'Add Run Script'
- Seret dan lepas skrip perl Anda ke bagian skrip Anda. Ubah agar terlihat seperti ini:
cd $SRCROOT/licenses
( $SRCROOT
menunjuk ke akar proyek Anda)
./yourScriptName.pl
Setelah Anda menyelesaikannya, Anda dapat menarik Run Script
fase build lebih cepat dalam proses build. Anda ingin memindahkannya sebelumnya Compile Sources
sehingga pembaruan pada Bundel Pengaturan Anda dapat dikompilasi dan disalin.
Pembaruan untuk iOS 7: iOS 7 tampaknya menangani kunci "Judul" yang berbeda dan mengacaukan teks yang dirender. Untuk memperbaiki bahwa Acknowledgements.plist yang dihasilkan perlu menggunakan kunci "FooterText", bukan "Title". Ini cara mengubah skrip:
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);
}