วิธีที่ดีที่สุดในการเพิ่มส่วนใบอนุญาตในชุดการตั้งค่า iOS


116

แอปพลิเคชัน iOS ของฉันใช้ส่วนประกอบของบุคคลที่สามจำนวนหนึ่งที่ได้รับอนุญาตภายใต้ Apache 2.0 และใบอนุญาตที่คล้ายกันซึ่งทำให้ฉันต้องรวมส่วนต่างๆของข้อความประเภทนี้

* 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.

ดูเหมือนว่าจะมีแบบอย่างที่สมเหตุสมผลในการใส่ข้อมูลนี้ไว้ในส่วนย่อย 'ใบอนุญาต' ในชุดการตั้งค่า (บน ipad facebook, เพจ, ประเด็นสำคัญ, ตัวเลขและวิกิพานิออนดูเหมือนจะทำเช่นนี้)

ฉันกำลังดิ้นรนเล็กน้อยเพื่อให้บรรลุสิ่งเดียวกันจริงๆ ฉันดูเหมือนจะต้องแยกข้อความขึ้นทีละบรรทัดและเข้าสู่ xcode ทีละบรรทัด (และดูเหมือนว่า xcode4 จะมีปัญหาการขัดข้องเมื่อแก้ไข plists)

ดูเหมือนว่าจะมีสคริปต์ที่ไหนสักแห่งที่ต้องทำหรือวิธีง่ายๆในการทำที่ฉันพลาดไป

คำตอบ:


192

ฉันคิดว่าตอนนี้ฉันสามารถแก้ปัญหาทั้งหมดที่พบได้แล้ว

  • ดูเหมือนว่าจะเป็นการดีที่สุดที่จะใช้ชื่อองค์ประกอบกลุ่มเพื่อถือใบอนุญาต (นี่คือสิ่งที่ Apple ทำในแอพ iWork) อย่างไรก็ตามมีข้อ จำกัด เกี่ยวกับความยาวของสิ่งเหล่านี้ (และฉันยังไม่ได้ค้นพบว่าขีด จำกัด คืออะไร) ดังนั้นคุณต้องแบ่งไฟล์ลิขสิทธิ์แต่ละไฟล์ออกเป็นหลาย ๆ สตริง
  • คุณสามารถสร้างตัวแบ่งบรรทัดภายในสิ่งเหล่านี้ได้โดยรวมการส่งคืนการขนส่งตามตัวอักษร (เช่นหรือเรียกอีกอย่างว่า ^ M, \ r หรือ 0x0A)
  • อย่าใส่ข้อความตรงกลางของลิเทอรัลหากคุณทำเช่นนั้นสตริงบางส่วนหรือทั้งหมดในไฟล์จะถูกละเว้นโดยไม่โต้ตอบ

ฉันมีสคริปต์อำนวยความสะดวกที่ใช้เพื่อช่วยสร้างไฟล์. plist และ. string ที่แสดงด้านล่าง

วิธีใช้:

  1. สร้างไดเรกทอรี 'ใบอนุญาต' ภายใต้โครงการของคุณ
  2. ใส่สคริปต์ลงในไดเร็กทอรีนั้น
  3. ใส่แต่ละไลเซนส์ลงในไดเร็กทอรีนั้นหนึ่งรายการต่อไฟล์โดยมีชื่อไฟล์ที่ลงท้ายด้วย. license
  4. ทำการฟอร์แมตใหม่ที่จำเป็นในใบอนุญาต (เช่นลบช่องว่างเพิ่มเติมที่จุดเริ่มต้นของบรรทัดตรวจสอบให้แน่ใจว่าไม่มีเส้นแบ่งกลางย่อหน้า) ควรมีบรรทัดว่างระหว่างแต่ละย่อหน้า
  5. เปลี่ยนเป็นไดเร็กทอรีไลเซนส์และรันสคริปต์
  6. แก้ไขบันเดิลการตั้งค่าของคุณ Root.plist เพื่อรวมส่วนย่อยที่เรียกว่า 'Acknowledgments'

นี่คือสคริปต์:

#!/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 ให้ไปที่ File -> New -> New File ...

ในส่วนทรัพยากรให้ค้นหาชุดการตั้งค่า ใช้ชื่อเริ่มต้นและบันทึกลงในรูทของโปรเจ็กต์ของคุณ

ขยายกลุ่มและเลือกSettings.bundle Root.plistคุณจะต้องเพิ่มส่วนใหม่ที่สำคัญของมันจะเป็นประเภทPreference Items Arrayเพิ่มข้อมูลต่อไปนี้:

ใส่คำอธิบายภาพที่นี่

Filenameจุดที่สำคัญเพื่อ plist ที่ถูกสร้างขึ้นโดยสคริปต์นี้ คุณสามารถเปลี่ยนเป็นtitleสิ่งที่คุณต้องการได้

เรียกใช้สคริปต์ในเวลาสร้าง

นอกจากนี้หากคุณต้องการให้สคริปต์นี้ทำงานเมื่อใดก็ตามที่คุณสร้างโปรเจ็กต์ของคุณคุณสามารถเพิ่มเฟสการสร้างให้กับเป้าหมายของคุณ:

  1. ไปที่ไฟล์โครงการของคุณ
  2. เลือกเป้าหมาย
  3. คลิกแท็บขั้นตอนการสร้าง
  4. ที่มุมขวาล่างของบานหน้าต่างนั้นให้คลิกที่ 'Add Build Phase'
  5. เลือก 'Add Run Script'
  6. ลากและวางสคริปต์ perl ของคุณลงในส่วนของสคริปต์ของคุณ แก้ไขให้มีลักษณะดังนี้:
  1. cd $SRCROOT/licenses( $SRCROOTชี้ไปที่รากของโครงการของคุณ)
  2. ./yourScriptName.pl

หลังจากเสร็จสิ้นคุณสามารถลากRun Scriptระยะการสร้างได้เร็วขึ้นในขั้นตอนการสร้าง คุณจะต้องเลื่อนขึ้นมาก่อนCompile Sourcesเพื่อให้การอัปเดตในชุดการตั้งค่าของคุณถูกรวบรวมและคัดลอก

การอัปเดตสำหรับ iOS 7: iOS 7 ดูเหมือนว่าจะจัดการกับคีย์ "Title" แตกต่างออกไปและทำให้ข้อความที่แสดงผลยุ่งเหยิง ในการแก้ไขว่า 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);
}

1
ช่างเป็นความคิดที่ยอดเยี่ยมจริงๆ! ฉันเริ่มทำสิ่งนี้ด้วยตนเองก่อนที่ฉันจะรู้ได้อย่างรวดเร็วว่าฉันต้องการโซลูชันอัตโนมัติโดยเฉพาะอย่างยิ่งเนื่องจากขีดจำกัดความยาวของหัวเรื่องที่เข้มงวด
Hilton Campbell

9
สิ่งหนึ่งที่ต้องระวัง: "ชื่อไฟล์" คือรูปแบบการแสดงผลของคีย์ คีย์ที่แท้จริงคือ "ไฟล์" หากบานหน้าต่างย่อยไม่ปรากฏขึ้นให้คลิกขวาและเลือก "Show Raw Keys / Values" และตรวจสอบว่าชื่อคีย์คือ "File"
ใต้หลังคา

10
มันยอดเยี่ยมมากขอบคุณ ฉันใช้ 'cd "$ SRCROOT / Licenses /"' ในบล็อก Run Script ซึ่งจะทำงานได้ดีขึ้นเล็กน้อยหากคุณมีหลายคนที่ทำงานในโครงการ
ริส

9
อ่านdevforums.apple.com/message/894791#894791หากคุณใช้สิ่งนี้กับ iOS7 โดยเฉพาะคุณอาจต้องเปลี่ยน <key> Title </key> เป็น <key> FooterText </key> เพื่อให้ดูเป็นปกติ
esilver

2
วิธีทำให้เป็นบานหน้าต่างย่อย: สร้างรายการ 0 ภายในรายการการตั้งค่า ดูเหมือนว่าคุณไม่สามารถเลือก Child Pane เป็นประเภทได้ แต่สิ่งที่คุณทำคือสร้างไอเท็มภายใต้ Item 0 (s subitem of Item 0) และไอเท็มแรกนั้นมีคีย์“ Type” เพื่อให้ง่ายขึ้นให้คลิกขวาที่สิ่งนี้แล้วเลือก Show Raw Keys / Values คุณต้องการตั้งค่าสำหรับ Type เป็น PSChildPaneSpecifier เมื่อคุณยกเลิกการตั้งค่า Show Raw Keys / Values ​​ตอนนี้จะขึ้นว่า Child Pane แม้กระทั่งในชื่อรายการ 0 นั่นคือ“ Its 0 (Child Pane -)” นี่คือสิ่งที่คุณต้องการ
Marc

36

นี่เป็นวิธีเดียวกับที่ @JosephH ให้ไว้ (ไม่มีคำแปล) แต่ทำใน Python สำหรับใครก็ตามที่ชอบ python มากกว่า 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"
)

คำตอบนี้ต้องการการโหวตเพิ่มขึ้น ไวยากรณ์ Python ไวยากรณ์<3Perl ;)
Ricardo Sanchez-Saez

5
current_file = codecs.open(filename, 'r', 'utf-8')สำหรับใบอนุญาต Unicode
user2821144

ขอบคุณ! ฉันได้สร้างเวอร์ชันใหม่โดยใช้เวอร์ชันนี้ซึ่งเหมาะสำหรับคาร์เธจ นอกจากนี้ยังลบบรรทัดใหม่ที่ไม่จำเป็นออกจากข้อความใบอนุญาต ลองดู: gist.github.com/Zyphrax/0d015c618d46093b4f815e62a6a33969
Zyphrax

1
ฉันได้ทำงานเพิ่มอีกเล็กน้อยโปรดดูที่: github.com/Building42/AckAck
Zyphrax

15

อีกทางเลือกหนึ่งสำหรับผู้ที่ใช้ CocoaPods จะสร้าง plist 'Acknowled ไฟล์รายการคุณสมบัติที่สามารถเพิ่มลงในชุดการตั้งค่า iOS

นอกจากนี้ยังมีโครงการที่อนุญาตให้แปลงและแสดงข้อมูลนี้ภายในแอปแทน:

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

https://github.com/cocoapods/CPDAcknowledgements


3
ดูข้อมูลเพิ่มเติมได้ที่: github.com/CocoaPods/CocoaPods/wiki/Acknowledgements
Oren

โปรดทราบว่า Cocoapods wiki มีชื่อไฟล์อินพุตเป็น Pods-Acknowledgements.plist แต่จริงๆแล้วไฟล์จะถูกสร้างเป็น Pods-noticements.plist (ตัวพิมพ์เล็ก 'a') การใช้กรณีที่ไม่ถูกต้องจะทำให้การติดตั้งพ็อดไม่ได้หากระบบไฟล์ของคุณคำนึงถึงตัวพิมพ์เล็กและใหญ่
Keller

14

ฉันคิดว่าฉันจะโยนรหัสหลามที่น่ากลัวของฌอนมาผสมกัน ข้อแตกต่างที่สำคัญคือต้องใช้ไดเรกทอรีอินพุตจากนั้นจึงค้นหาไฟล์ LICENSE ซ้ำ ได้รับค่าหัวเรื่องจากไดเร็กทอรีหลักของไฟล์ LICENSE ดังนั้นจึงเล่นได้ดีกับ cocoapods

แรงจูงใจคือการสร้างบิลด์สคริปต์เพื่อให้ส่วนกฎหมายของแอปของฉันอัปเดตโดยอัตโนมัติเมื่อฉันเพิ่มหรือลบพ็อด นอกจากนี้ยังทำสิ่งอื่น ๆ เช่นลบบรรทัดใหม่ที่บังคับออกจากใบอนุญาตเพื่อให้ย่อหน้าดูดีขึ้นเล็กน้อยบนอุปกรณ์

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

ใส่คำอธิบายภาพที่นี่


8

ฉันสร้างสคริปต์ใน Ruby ที่ได้รับแรงบันดาลใจจากสคริปต์ @JosephH ในความคิดของฉันเองเวอร์ชันนี้จะเป็นตัวแทนของโครงการโอเพ่นซอร์สแต่ละโครงการ

Wisit iOS-AcknowledgementGeneratorเพื่อดาวน์โหลดสคริปต์และโปรเจ็กต์ตัวอย่าง

นี่คือลักษณะของการตอบรับในแอปของคุณ:

Settings.app Settings.bundle กิตติกรรมประกาศ ใส่คำอธิบายภาพที่นี่


2

นี่คือภาคผนวกสำหรับคำตอบของ JosephH (ฉันไม่มีตัวแทนที่จะแสดงความคิดเห็น)

ฉันต้องเลื่อน <key>StringsTable</key> <string>Acknowledgements</string> ลงไปด้านบนสุดท้าย</dict>ในสคริปต์ Perl

ก่อนการแก้ไขนี้ส่วนการรับทราบในแอปว่างเปล่าและ XCode ไม่สามารถอ่านผลลัพธ์ Acknowledgements.plist ("ไม่สามารถอ่านข้อมูลได้เนื่องจากไม่อยู่ในรูปแบบที่ถูกต้อง")

(XCode 6.3.2 iOS 8.3)


2

สคริปต์ Python จาก Sean ในเธรดนี้ใช้งานได้ แต่มีสองสิ่งพื้นฐานที่ควรรู้

  1. ใน Xcode ให้คลิกขวาที่ด้านบนของแผนผัง Project Navigator บนชื่อโครงการของคุณและเพิ่มกลุ่มใหม่ สิ่งนี้ทำให้โฟลเดอร์ใหม่ในโปรเจ็กต์ของคุณ
  2. เพิ่มสคริปต์ของ Sean ที่นั่นและอย่าลืมบันทึกเป็น: Acknowledgements.py
  3. ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้ง Python ในระบบของคุณ ฉันใช้ Mac
  4. เพิ่มไฟล์ลิขสิทธิ์แรกลงในโฟลเดอร์ที่คุณสร้างใน 1 ทำให้ง่ายเหมือนมีคำเดียวในไฟล์พูดว่า: กำลังทดสอบ บันทึกลงในโฟลเดอร์เป็น Test1.license
  5. ตั้งค่า Settings.bundle ของคุณตาม JosephH ด้านบน
  6. ใช้แอพ Terminal ของคุณลงซีดีไปยังโฟลเดอร์ที่คุณสร้างใน 1
  7. เรียกใช้สคริปต์ ประเภท: python Acknowledgements.py หากคุณไม่ได้รับข้อผิดพลาดจะกลับไปที่พรอมต์ Terminal ทำทั้งหมดนี้ก่อนที่จะเพิ่ม run script ใด ๆ ใน Build
  8. สร้างและเรียกใช้แอปของคุณ
  9. แตะสองครั้งที่ปุ่มโฮมของ iPhone และฆ่าการตั้งค่า มักจะไม่รับการเปลี่ยนแปลงการตั้งค่าสำหรับแอปของคุณจนกว่าการตั้งค่าจะรีสตาร์ท
  10. หลังจากรีสตาร์ทการตั้งค่าไปที่แอพของคุณและดูว่าใช้งานได้หรือไม่
  11. หากทุกอย่างได้ผลให้ค่อยๆเพิ่มไฟล์ลิขสิทธิ์มากขึ้น แต่เรียกใช้สคริปต์ทุกครั้ง คุณอาจได้รับข้อผิดพลาดในการเรียกใช้สคริปต์เนื่องจากอักขระบางตัวในไฟล์ดังนั้นวิธีง่ายๆในการดีบักคือเพิ่มไฟล์เรียกใช้สคริปต์ดูว่าใช้งานได้และดำเนินการต่อหรือไม่ มิฉะนั้นแก้ไขอักขระพิเศษใด ๆ จากไฟล์. license
  12. ฉันไม่ได้รับ Run Build Script ทำงานตามคำแนะนำด้านบน แต่กระบวนการนี้ใช้ได้ดีถ้าคุณไม่ได้เปลี่ยนไฟล์. license บ่อยๆ

1

Ack Ack: Acknowledgement Plist Generator
A ในขณะที่กลับมาฉันได้สร้างสคริปต์ Python ที่สแกนหาไฟล์ใบอนุญาตและสร้างแอปการรับทราบที่ดีที่คุณสามารถใช้ใน Settings.plist ของคุณ มันทำงานให้คุณได้มาก

https://github.com/Building42/AckAck

คุณสมบัติ

  • ตรวจพบโฟลเดอร์ Carthage และ CocoaPods
  • ตรวจจับ plists ที่มีอยู่สำหรับใบอนุญาตที่กำหนดเอง
  • ทำความสะอาดข้อความใบอนุญาตโดยลบบรรทัดใหม่และตัวแบ่งบรรทัดใหม่ที่ไม่จำเป็น
  • มีตัวเลือกการปรับแต่งมากมาย (ดู--helpรายละเอียด)
  • รองรับทั้ง Python v2 และ v3

ติดตั้ง

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

วิ่ง

./ackack.py

ภาพหน้าจอ

กิตติกรรมประกาศ

หากคุณมีข้อเสนอแนะสำหรับการปรับปรุงอย่าลังเลที่จะโพสต์ปัญหาหรือดึงคำขอใน GitHub!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.