Tôi nghĩ bây giờ tôi đã giải quyết được tất cả các vấn đề mà tôi đang gặp phải.
- Có vẻ như tốt nhất là sử dụng các tiêu đề phần tử nhóm để giữ giấy phép (đây là những gì Apple làm trong các ứng dụng iWork). Tuy nhiên, có một giới hạn về độ dài của chúng (và tôi vẫn chưa khám phá ra chính xác giới hạn là gì), vì vậy bạn cần chia từng tệp giấy phép thành nhiều chuỗi.
- Bạn có thể tạo dấu ngắt dòng bên trong những dấu này bằng cách bao gồm một ký tự xuống dòng theo nghĩa đen (tức là. Còn được gọi là ^ M, \ r hoặc 0x0A)
- Đảm bảo không bao gồm bất kỳ ký tự nào ở giữa văn bản. Nếu bạn làm vậy, một số hoặc tất cả các chuỗi trong tệp sẽ bị bỏ qua một cách im lặng.
Tôi có một tập lệnh tiện lợi mà tôi sử dụng để giúp tạo tệp .plist và .strings, được hiển thị bên dưới.
Để dùng nó:
- Tạo thư mục 'giấy phép' trong dự án của bạn
- Đặt script vào thư mục đó
- Đặt từng giấy phép vào thư mục đó, một giấy phép cho mỗi tệp, với tên tệp kết thúc .license
- Thực hiện mọi định dạng cần thiết trên giấy phép. (ví dụ: loại bỏ khoảng trắng thừa ở đầu dòng, đảm bảo rằng không có ngắt dòng giữa đoạn). Phải có một dòng trống ở giữa mỗi đoạn
- Thay đổi thư mục giấy phép và chạy tập lệnh
- Chỉnh sửa gói cài đặt của bạn Root.plist để bao gồm một phần con có tên là 'Lời cảm ơn'
Đây là kịch bản:
#!/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);
Thiết lập Settings.bundle của bạn
Nếu bạn chưa tạo nhóm Settings.bundle, hãy chuyển đến File -> New -> New File ...
Trong phần Tài nguyên, tìm Gói cài đặt. Sử dụng tên mặc định và lưu nó vào thư mục gốc của dự án của bạn.
Mở rộng Settings.bundle
nhóm và chọn Root.plist
. Bạn sẽ cần thêm một phần mới nơi khóa của nó sẽ Preference Items
thuộc loại Array
. Thêm thông tin sau:
Các Filename
điểm chính của bảng xếp hạng được tạo bởi tập lệnh này. Bạn có thể thay đổi title
thành những gì bạn muốn.
Thực thi Script tại thời điểm xây dựng
Ngoài ra, nếu bạn muốn tập lệnh này chạy bất cứ khi nào bạn xây dựng dự án của mình, bạn có thể thêm giai đoạn xây dựng vào mục tiêu của mình:
- Đi tới tệp dự án của bạn
- Chọn mục tiêu
- Nhấp vào tab Xây dựng giai đoạn
- Ở góc dưới bên phải của ngăn đó, nhấp vào 'Thêm giai đoạn xây dựng'
- Chọn 'Thêm tập lệnh chạy'
- Kéo và thả tập lệnh perl của bạn vào phần dành cho tập lệnh của bạn. Sửa đổi để trông giống như sau:
cd $SRCROOT/licenses
( $SRCROOT
trỏ đến gốc của dự án của bạn)
./yourScriptName.pl
Sau khi hoàn thành việc đó, bạn có thể kéo Run Script
giai đoạn xây dựng sớm hơn trong quá trình xây dựng. Bạn sẽ muốn chuyển nó lên trước Compile Sources
để các bản cập nhật cho Gói cài đặt của bạn được biên dịch và sao chép.
Bản cập nhật cho iOS 7: iOS 7 dường như xử lý phím "Tiêu đề" khác và đang làm rối văn bản được hiển thị. Để khắc phục điều đó Acknowledgements.plist đã tạo cần sử dụng khóa "FooterText" thay vì "Title". Đây là cách thay đổi tập lệnh:
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);
}