cách tốt nhất để thêm phần giấy phép vào gói cài đặt iOS


116

Ứng dụng iOS của tôi sử dụng một số thành phần của bên thứ ba được cấp phép theo Apache 2.0 và các giấy phép tương tự, các giấy phép này yêu cầu tôi bao gồm các bit văn bản khác nhau, đại loại như sau:

* Redistributions in binary form must reproduce the above copyright
  notice, this list of conditions and the following disclaimer in the
  documentation and/or other materials provided with the distribution.

Dường như có một tiền lệ hợp lý cho việc đặt thông tin này dưới một tiểu mục 'Giấy phép' trong gói cài đặt (trên facebook ipad, các trang, bài phát biểu, số và wikipanion dường như đều làm điều này).

Tôi đang đấu tranh một chút để thực sự đạt được điều tương tự; Tôi dường như cần phải tách văn bản theo từng dòng và nhập vào xcode một dòng tại một thời điểm (và xcode4 dường như gặp sự cố khi chỉnh sửa plists).

Có vẻ như đây là kiểu mà gần như chắc chắn có một kịch bản nào đó để làm, hoặc một số cách đơn giản để làm điều đó mà tôi đã bỏ qua.

Câu trả lời:


192

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ó:

  1. Tạo thư mục 'giấy phép' trong dự án của bạn
  2. Đặt script vào thư mục đó
  3. Đặ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
  4. 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
  5. Thay đổi thư mục giấy phép và chạy tập lệnh
  6. 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.bundlenhó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 Itemsthuộc loại Array. Thêm thông tin sau:

nhập mô tả hình ảnh ở đây

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 titlethà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:

  1. Đi tới tệp dự án của bạn
  2. Chọn mục tiêu
  3. Nhấp vào tab Xây dựng giai đoạn
  4. Ở 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'
  5. Chọn 'Thêm tập lệnh chạy'
  6. 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:
  1. cd $SRCROOT/licenses( $SRCROOTtrỏ đến gốc của dự án của bạn)
  2. ./yourScriptName.pl

Sau khi hoàn thành việc đó, bạn có thể kéo Run Scriptgiai đ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);
}

1
Thật là một ý tưởng tuyệt vời! Tôi bắt đầu thực hiện việc này theo cách thủ công trước khi nhanh chóng nhận ra rằng tôi cần một giải pháp tự động, đặc biệt là do giới hạn độ dài tiêu đề nhóm hà khắc.
Hilton Campbell

9
Một điều cần chú ý: "Tên tệp" là hình thức hiển thị của khóa. Chìa khóa thực tế là "Tệp". Nếu ngăn con không hiển thị, hãy nhấp chuột phải và chọn "Show Raw Keys / Values" và đảm bảo rằng tên khóa là "File".
gác mái

10
Điều này là tuyệt vời, cảm ơn. Tôi đã sử dụng 'cd "$ SRCROOT / Licenses /"' trong khối Run Script hoạt động tốt hơn một chút nếu bạn có nhiều người cùng làm việc trong một dự án.
chris

9
Đọc devforums.apple.com/message/894791#894791 nếu bạn đang sử dụng phần mềm này với iOS7. Cụ thể, bạn có thể cần thay đổi <key> Title </key> thành <key> FooterText </key> để làm cho nó trông bình thường.
esilver

2
Cách đặt nó thành ngăn con: Tạo Mục 0 bên trong Mục Sở thích. Có vẻ như bạn không thể chọn Ngăn con làm loại, nhưng những gì bạn làm là tạo một mục trong Mục 0 (các tiểu mục của Mục 0) và mục đầu tiên có khóa “Loại”. Để dễ dàng hơn, hãy nhấp chuột phải vào phần này và chọn Hiển thị Khóa / Giá trị Nguyên. Bạn muốn đặt giá trị cho Loại là PSChildPaneSpecifier. Sau khi bạn bỏ thiết lập Hiển thị Khóa / Giá trị thô, giờ đây nó sẽ hiển thị Ngăn con, ngay cả trong tên của Mục 0, tức là “0 của Nó (Ngăn con -)”. Đây là cái bạn muốn.
Marc

36

Đây là giải pháp tương tự mà @JosephH đã cung cấp (không có bản dịch), nhưng được thực hiện bằng Python cho bất kỳ ai thích python hơn perl

import os
import sys
import plistlib
from copy import deepcopy

os.chdir(sys.path[0])

plist = {'PreferenceSpecifiers': [], 'StringsTable': 'Acknowledgements'}
base_group = {'Type': 'PSGroupSpecifier', 'FooterText': '', 'Title': ''}

for filename in os.listdir("."):
    if filename.endswith(".license"):
        current_file = open(filename, 'r')
        group = deepcopy(base_group)
        title = filename.split(".license")[0]
        group['Title'] = title
        group['FooterText'] = current_file.read()
        plist['PreferenceSpecifiers'].append(group)

plistlib.writePlist(
    plist,
    "../Settings.bundle/Acknowledgements.plist"
)

Câu trả lời này cần nhiều lượt ủng hộ hơn. Cú pháp Python Cú pháp <3Perl. ;)
Ricardo Sanchez-Saez

5
current_file = codecs.open(filename, 'r', 'utf-8')cho giấy phép unicode.
user2821144

Cảm ơn! Tôi đã tạo một phiên bản mới dựa trên phiên bản này, rất tốt cho Carthage. Nó cũng loại bỏ một số dòng mới không cần thiết khỏi văn bản giấy phép. Hãy khám phá: gist.github.com/Zyphrax/0d015c618d46093b4f815e62a6a33969
Zyphrax vào

1
Tôi đã đặt một chút công việc nhiều hơn trong đó, xem: github.com/Building42/AckAck
Zyphrax

15

Thay vào đó, đối với những người sử dụng CocoaPods, nó sẽ tạo một plist 'Lời cảm ơn' cho từng mục tiêu được chỉ định trong Podfile của bạn, chứa chi tiết Giấy phép cho từng Pod được sử dụng trong mục tiêu đó (giả sử chi tiết đã được chỉ định trong thông số Pod). Tệp danh sách thuộc tính có thể được thêm vào gói cài đặt iOS.

Cũng có những dự án đang được tiến hành để cho phép dữ liệu này được chuyển đổi và hiển thị trong ứng dụng thay thế:

https://github.com/CocoaPods/cocoapods-install-metadata

https://github.com/cocoapods/CPDAcknowledgements


3
Đây là thông tin thêm về nó: github.com/CocoaPods/CocoaPods/wiki/Acknowledgements
Oren

Xin lưu ý rằng Cocoapods wiki có tên tệp đầu vào là Pods-Acknowledgements.plist nhưng tệp thực sự được tạo dưới dạng Pods-Recogments.plist (chữ thường 'a'). Sử dụng sai trường hợp sẽ phá vỡ cài đặt pod nếu hệ thống tệp của bạn phân biệt chữ hoa chữ thường.
Keller

14

Tôi nghĩ rằng tôi sẽ lặp lại mã python tuyệt vời của Sean trong hỗn hợp. Sự khác biệt chính là nó lấy một thư mục đầu vào và sau đó tìm kiếm đệ quy nó cho các tệp LICENSE. Nó lấy giá trị tiêu đề từ thư mục mẹ của tệp LICENSE, vì vậy nó hoạt động tốt với cocoapods.

Động lực là tạo một tập lệnh xây dựng để tự động cập nhật phần pháp lý trong ứng dụng của tôi khi tôi thêm hoặc xóa các nhóm. Nó cũng thực hiện một số việc khác như xóa các dòng mới bắt buộc khỏi giấy phép để các đoạn văn trông đẹp hơn một chút trên thiết bị.

https://github.com/carloe/LicenseGenerator-iOS

nhập mô tả hình ảnh ở đây


8

Tôi đã tạo một kịch bản bằng Ruby được truyền cảm hứng bởi @JosephH script. Phiên bản này, theo ý kiến ​​của riêng tôi, sẽ đại diện tốt hơn cho các dự án mã nguồn mở riêng lẻ.

Mong muốn iOS-AcknowledgementGenerator tải xuống tập lệnh và dự án mẫu.

Đây là những gì xác nhận sẽ giống như trong Ứng dụng của bạn:

Settings.app Settings.bundle Sự nhìn nhận nhập mô tả hình ảnh ở đây


2

Đây là một phụ lục cho câu trả lời của JosephH. (Tôi không có đại diện để bình luận)

Tôi đã phải di chuyển <key>StringsTable</key> <string>Acknowledgements</string> xuống phía trên cuối cùng </dict>trong tập lệnh Perl.

Trước khi sửa đổi này, Phần Lời cảm ơn trong Ứng dụng trống và XCode không thể đọc Acknowledgements.plist kết quả. ("Không thể đọc dữ liệu vì nó không có định dạng chính xác.")

(XCode 6.3.2 iOS 8.3)


2

Tập lệnh Python từ Sean trong luồng này hoạt động. Nhưng có một số điều cơ bản cần biết.

  1. trong Xcode, nhấp chuột phải vào đầu cây Điều hướng Dự án, vào tên dự án của bạn và thêm Nhóm mới. Điều này đặt một thư mục mới trong dự án của bạn.
  2. Thêm tập lệnh của Sean vào đó và đảm bảo lưu nó dưới dạng: Acknowledgements.py.
  3. Đảm bảo rằng bạn đã cài đặt Python trên hệ thống của mình. Tôi đang sử dụng máy Mac.
  4. Thêm tệp giấy phép đầu tiên vào thư mục bạn đã tạo trong 1. Làm cho nó đơn giản như chỉ có một từ trong tệp, chẳng hạn: Thử nghiệm. Lưu nó trong thư mục dưới dạng Test1.license.
  5. Thiết lập Settings.bundle của bạn theo JosephH ở trên.
  6. Sử dụng ứng dụng Terminal của bạn vào đĩa CD vào thư mục bạn đã tạo trong 1.
  7. Chạy tập lệnh. Nhập: python Acknowledgements.py. Nếu bạn không gặp lỗi, nó sẽ trở lại ngay cửa sổ Terminal. Thực hiện tất cả những điều này trước khi thêm bất kỳ tập lệnh chạy nào vào Bản dựng.
  8. Xây dựng và chạy ứng dụng của bạn.
  9. Nhấn đúp vào nút màn hình chính của iPhone và tắt Cài đặt. Nó không thường nhận thay đổi Cài đặt cho ứng dụng của bạn cho đến khi Cài đặt khởi động lại.
  10. Sau khi khởi động lại Cài đặt, hãy truy cập ứng dụng của bạn và xem nó có hoạt động không.
  11. Nếu tất cả đều hoạt động, hãy từ từ thêm nhiều tệp giấy phép hơn nhưng chạy tập lệnh mỗi lần. Bạn có thể gặp lỗi khi chạy tập lệnh do một số ký tự nhất định trong tệp nên cách dễ dàng để gỡ lỗi là thêm tệp, chạy tập lệnh, xem nó có hoạt động hay không và tiếp tục. Ngoài ra, hãy chỉnh sửa bất kỳ ký tự đặc biệt nào trong tệp .license.
  12. Tôi không nhận được Run Build Script theo hướng dẫn ở trên. Nhưng quá trình này hoạt động tốt nếu bạn không thường xuyên thay đổi tệp .license.

1

Ack Ack: Acknowledgement Plist Generator
Một lần trước, tôi đã tạo một tập lệnh Python để quét các tệp giấy phép và tạo một danh sách Lời cảm ơn đẹp mà bạn có thể sử dụng trong Settings.plist của mình. Nó làm rất nhiều việc cho bạn.

https://github.com/Building42/AckAck

Đặc trưng

  • Phát hiện các thư mục Carthage và CocoaPods
  • Phát hiện danh sách hiện có cho giấy phép tùy chỉnh
  • Dọn dẹp văn bản giấy phép bằng cách xóa các dòng mới và ngắt dòng không cần thiết
  • Cung cấp nhiều tùy chọn tùy chỉnh (xem --helpđể biết chi tiết)
  • Hỗ trợ cả Python v2 và v3

Tải về

wget https://raw.githubusercontent.com/Building42/AckAck/master/ackack.py
chmod +x ackack.py

Chạy

./ackack.py

Ảnh chụp màn hình

Sự nhìn nhận

Nếu bạn có đề xuất cải tiến, vui lòng đăng vấn đề hoặc gửi yêu cầu trên GitHub!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.