cara terbaik untuk menambahkan bagian lisensi ke bundel pengaturan iOS

116

Aplikasi iOS saya menggunakan sejumlah komponen pihak ketiga yang dilisensikan di bawah Apache 2.0 dan lisensi serupa, yang mengharuskan saya untuk memasukkan berbagai potongan teks, hal semacam ini:

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

Tampaknya ada preseden yang masuk akal untuk meletakkan informasi ini di bawah subentri 'Lisensi' dalam bundel pengaturan (di facebook ipad, halaman, keynote, nomor dan wiki semua tampaknya melakukan ini).

Saya berjuang sedikit untuk benar-benar mencapai hal yang sama; Sepertinya saya perlu membagi teks baris demi baris dan memasukkan xcode satu baris pada satu waktu (dan xcode4 tampaknya mengalami masalah saat mengedit plists).

Sepertinya hal yang hampir pasti ada skrip di suatu tempat untuk dilakukan, atau cara sederhana untuk melakukannya yang saya lewatkan.

JosephH
sumber

Jawaban:

192

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:

  1. Buat direktori 'lisensi' di bawah proyek Anda
  2. Masukkan skrip ke direktori itu
  3. Letakkan setiap lisensi ke dalam direktori itu, satu per file, dengan nama file yang berakhiran .license
  4. 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
  5. Ubah ke direktori lisensi & jalankan skrip
  6. 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.bundlegrup dan pilih Root.plist. Anda perlu menambahkan bagian baru di mana kuncinya akan Preference Itemsbertipe Array. Tambahkan informasi berikut:

masukkan deskripsi gambar di sini

The Filenamepoin kunci untuk plist yang telah dibuat oleh script ini. Anda dapat mengubah titleapa 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:

  1. Buka file proyek Anda
  2. Pilih target
  3. Klik tab Build Phases
  4. Di sudut kanan bawah panel itu, klik 'Tambahkan Fase Bangun'
  5. Pilih 'Add Run Script'
  6. Seret dan lepas skrip perl Anda ke bagian skrip Anda. Ubah agar terlihat seperti ini:
  1. cd $SRCROOT/licenses( $SRCROOTmenunjuk ke akar proyek Anda)
  2. ./yourScriptName.pl

Setelah Anda menyelesaikannya, Anda dapat menarik Run Scriptfase build lebih cepat dalam proses build. Anda ingin memindahkannya sebelumnya Compile Sourcessehingga 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);
}
JosephH
sumber
1
Ide yang luar biasa! Saya mulai melakukan ini secara manual sebelum saya segera menyadari bahwa saya memerlukan solusi otomatis, terutama karena batas panjang judul grup yang kejam.
Hilton Campbell
9
Satu hal yang harus diperhatikan: "Filename" adalah tampilan bentuk kunci. Kunci sebenarnya adalah "File". Jika panel anak tidak muncul, klik kanan dan pilih "Tampilkan Kunci / Nilai Mentah" dan pastikan bahwa nama kuncinya adalah "File".
atticus
10
Ini luar biasa, terima kasih. Saya menggunakan 'cd "$ SRCROOT / Licenses /"' di blok Run Script yang bekerja sedikit lebih baik jika Anda memiliki banyak orang yang mengerjakan sebuah proyek.
chris
9
Baca devforums.apple.com/message/894791#894791 jika Anda menggunakan ini dengan iOS7. Secara khusus Anda mungkin perlu mengubah <key> Title </key> menjadi <key> FooterText </key> agar terlihat normal.
esilver
2
Cara membuatnya menjadi panel anak: Buat Item 0 di dalam Item Preferensi. Sepertinya Anda tidak dapat memilih Panel Anak sebagai tipe, tetapi yang Anda lakukan adalah membuat item di bawah Item 0 (subitem dari Item 0) dan item pertama itu memiliki kunci "Jenis". Untuk membuatnya lebih mudah, klik kanan ini dan pilih Show Raw Keys / Values. Anda ingin menyetel nilai untuk Type menjadi PSChildPaneSpecifier. Setelah Anda menghapus Show Raw Keys / Values, sekarang akan tertulis Panel Anak, bahkan dalam nama untuk Item 0, yaitu "Its 0 (Child Pane -)". Ini yang kamu inginkan.
Marc
36

Berikut solusi yang sama yang disediakan @JosephH (tanpa terjemahan), tetapi dilakukan dengan Python untuk siapa saja yang lebih suka python daripada 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"
)
Sean
sumber
Jawaban ini membutuhkan lebih banyak suara positif. Sintaks Python sintaks <3Perl. ;)
Ricardo Sanchez-Saez
5
current_file = codecs.open(filename, 'r', 'utf-8')untuk lisensi unicode.
pengguna2821144
Terima kasih! Saya telah membuat versi baru berdasarkan yang satu ini yang bagus untuk Carthage. Ini juga menghapus beberapa baris baru yang tidak perlu dari teks lisensi. Lihat ini: gist.github.com/Zyphrax/0d015c618d46093b4f815e62a6a33969
Zyphrax
1
Saya telah memberikan sedikit lebih banyak pekerjaan di dalamnya, lihat: github.com/Building42/AckAck
Zyphrax
15

Sebagai alternatif, bagi mereka yang menggunakan CocoaPods, ini akan menghasilkan daftar 'Ucapan Terima Kasih' untuk setiap target yang ditentukan dalam Podfile Anda yang berisi detail Lisensi untuk setiap Pod yang digunakan dalam target tersebut (dengan asumsi detail telah ditentukan dalam spesifikasi Pod). File daftar properti yang dapat ditambahkan ke bundel pengaturan iOS.

Ada juga proyek yang sedang berjalan untuk memungkinkan data ini dikonversi dan ditampilkan dalam aplikasi sebagai gantinya:

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

https://github.com/cocoapods/CPDAcknowledgements

JosephH
sumber
3
Berikut info lebih lanjut tentang itu: github.com/CocoaPods/CocoaPods/wiki/Acknowledgements
Oren
Ketahuilah bahwa wiki Cocoapods memiliki nama file input sebagai Pods-Acknowledgements.plist tetapi file tersebut sebenarnya dibuat sebagai Pods-acknowledements.plist (huruf kecil 'a'). Menggunakan kasus yang salah akan merusak pemasangan pod jika sistem file Anda peka huruf besar / kecil.
Keller
14

Saya pikir saya akan melemparkan iterasi saya pada kode python mengagumkan Sean dalam campuran. Perbedaan utamanya adalah ia mengambil direktori input dan kemudian mencarinya secara rekursif untuk file LICENSE. Ini mendapatkan nilai judul dari direktori induk dari file LISENSI, sehingga dapat diputar dengan baik dengan cocoapods.

Motivasinya adalah untuk membuat skrip build agar bagian hukum aplikasi saya tetap terbarui secara otomatis saat saya menambah atau menghapus pod. Itu juga melakukan beberapa hal lain seperti menghapus baris baru yang dipaksakan dari lisensi sehingga paragraf terlihat sedikit lebih baik di perangkat.

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

masukkan deskripsi gambar di sini

carloe
sumber
8

Saya membuat skrip di Ruby yang terinspirasi oleh skrip @JosephH. Versi ini, menurut pendapat saya, akan lebih mewakili proyek sumber terbuka individu.

Wisit iOS-AcknowledgementGenerator untuk mendownload script dan contoh proyek.

Seperti inilah tampilan ucapan terima kasih di Aplikasi Anda:

Settings.app Settings.bundle Ucapan Terima Kasih masukkan deskripsi gambar di sini

cvknage
sumber
2

Ini adalah tambahan dari jawaban JosephH. (Saya tidak memiliki perwakilan untuk berkomentar)

Saya harus pindah <key>StringsTable</key> <string>Acknowledgements</string> ke atas yang terakhir </dict>di script Perl.

Sebelum modifikasi ini, Bagian Ucapan Terima Kasih di Aplikasi kosong dan XCode tidak dapat membaca Acknowledgements.plist yang dihasilkan. ("Data tidak dapat dibaca karena tidak dalam format yang benar.")

(XCode 6.3.2 iOS 8.3)

mattti
sumber
2

Skrip Python dari Sean di utas ini berfungsi. Tetapi ada beberapa hal dasar yang perlu diketahui.

  1. di Xcode, klik kanan di atas pohon Project Navigator, pada nama proyek Anda, dan tambahkan Grup Baru. Ini menempatkan folder baru di proyek Anda.
  2. Tambahkan skrip Sean di sana dan pastikan untuk menyimpannya sebagai: Acknowledgements.py.
  3. Pastikan Anda telah menginstal Python di sistem Anda. Saya menggunakan Mac.
  4. Tambahkan file lisensi pertama ke folder yang Anda buat di 1. Sederhanakan seperti hanya memiliki satu kata di file, katakan: Pengujian. Simpan di folder sebagai Test1.license.
  5. Siapkan Settings.bundle Anda sesuai JosephH di atas.
  6. Gunakan aplikasi Terminal Anda ke CD ke folder yang Anda buat di 1.
  7. Jalankan skrip. Ketik: python Acknowledgements.py. Jika Anda tidak mendapatkan kesalahan, itu akan kembali ke prompt Terminal. Lakukan semua ini sebelum menambahkan skrip run apa pun ke Build.
  8. Buat dan jalankan aplikasi Anda.
  9. Ketuk dua kali pada tombol beranda iPhone dan matikan Pengaturan. Itu tidak sering mengambil perubahan Pengaturan untuk aplikasi Anda sampai Pengaturan dimulai ulang.
  10. Setelah memulai ulang Pengaturan, buka aplikasi Anda dan lihat apakah itu berfungsi.
  11. Jika semuanya berhasil, perlahan tambahkan lebih banyak file lisensi tetapi jalankan skrip setiap kali. Anda bisa mendapatkan kesalahan menjalankan skrip karena karakter tertentu dalam file sehingga cara mudah untuk men-debug adalah dengan menambahkan file, menjalankan skrip, melihat apakah berhasil dan melanjutkan. Atau, edit karakter khusus apa pun dari file .license.
  12. Saya tidak dapat menjalankan Run Build Script sesuai petunjuk di atas. Tetapi proses ini berfungsi dengan baik jika Anda tidak sering mengubah file .license.
D. Rothschild
sumber
1

Ack Ack: Acknowledgement Plist Generator
Beberapa waktu yang lalu saya telah membuat skrip Python yang memindai file lisensi dan membuat daftar Ucapan Terima Kasih yang dapat Anda gunakan di Settings.plist Anda. Itu banyak membantu Anda.

https://github.com/Building42/AckAck

fitur

  • Mendeteksi folder Carthage dan CocoaPods
  • Mendeteksi plist yang ada untuk lisensi khusus
  • Membersihkan teks lisensi dengan menghapus baris baru dan jeda baris yang tidak perlu
  • Menyediakan banyak opsi penyesuaian (lihat --helpuntuk detailnya)
  • Mendukung Python v2 dan v3

Install

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

Lari

./ackack.py

Screenshot

Ucapan Terima Kasih

Jika Anda memiliki saran untuk perbaikan, silakan posting masalah atau tarik permintaan di GitHub!

Zyphrax
sumber