iOS ayarları paketine lisans bölümü eklemenin en iyi yolu


116

İOS uygulamam, Apache 2.0 ve benzeri lisanslar altında lisanslanmış bir dizi üçüncü taraf bileşeni kullanıyor, bu da çeşitli metin parçalarını eklememi gerektiriyor, bu tür şeyler:

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

Bu bilgiyi ayarlar paketinde bir 'Lisans' alt girişi altına koymak için makul bir örnek var gibi görünüyor (ipad facebook, sayfalar, açılış notu, sayılar ve wikipanion'da hepsi bunu yapıyor gibi görünüyor).

Aslında aynı şeyi başarmak için biraz uğraşıyorum; Metni satır satır bölmem ve her seferinde bir satır xcode'a girmem gerekiyor gibi görünüyor (ve xcode4'ün plistleri düzenlerken bir çökme sorunu var gibi görünüyor).

Görünüşe göre, neredeyse kesinlikle yapılacak bir senaryo ya da bunu yapmanın basit bir yolu var ki kaçırdım.

Yanıtlar:


192

Sanırım şimdi karşılaştığım tüm sorunları çözmeyi başardım.

  • Lisanslara sahip olmak için grup öğesi başlıklarını kullanmak en iyisi gibi görünüyor (Apple'ın iWork uygulamalarında yaptığı şey budur). Bununla birlikte, bunların uzunluğunda bir sınır vardır (ve henüz tam olarak sınırın ne olduğunu keşfetmedim), bu nedenle her bir lisans dosyasını birden çok dizeye ayırmanız gerekir.
  • Değişmez bir satır başı (yani, ^ M, \ r veya 0x0A olarak bilinir) ekleyerek bunların içinde bir satır sonu oluşturabilirsiniz.
  • Metnin ortasına herhangi bir değişmez bilgi eklemediğinizden emin olun. Bunu yaparsanız, dosyadaki dizelerin bazıları veya tümü sessizce yok sayılır.

Aşağıda gösterilen .plist ve .strings dosyasını oluşturmaya yardımcı olması için kullandığım kullanışlı bir komut dosyası var.

Kullanmak için:

  1. Projenizin altında bir 'lisanslar' dizini oluşturun
  2. Betiği bu dizine koyun
  3. Her lisansı, .license ile biten dosya adlarıyla dosya başına bir tane olacak şekilde bu dizine yerleştirin.
  4. Lisanslar üzerinde gerekli tüm yeniden biçimlendirmeleri yapın. (örneğin, satırların başındaki fazla boşlukları kaldırın, paragrafın ortasında satır sonu olmamasını sağlayın). Her paragrafın arasında boş bir satır olmalıdır
  5. Lisanslar dizinine geçin ve komut dosyasını çalıştırın
  6. Root.plist ayar paketinizi 'Teşekkürler' adlı bir alt bölüm içerecek şekilde düzenleyin

İşte senaryo:

#!/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);

Ayarlarınızı yapma.bundle

Bir Settings.bundle oluşturmadıysanız, Dosya -> Yeni -> Yeni Dosya ... seçeneğine gidin.

Kaynak bölümünün altında, Ayarlar Paketini bulun. Varsayılan adı kullanın ve projenizin kök dizinine kaydedin.

Settings.bundleGrubu genişletin ve seçin Root.plist. Anahtarının Preference Itemstüründe olacağı yeni bir bölüm eklemeniz gerekecek Array. Aşağıdaki bilgileri ekleyin:

görüntü açıklamasını buraya girin

FilenameBu komut dosyası tarafından oluşturulan plist için önemli noktalar. Değiştirebilirsintitle .

Derleme Zamanında Komut Dosyasını Yürüt

Ayrıca, bu betiğin projenizi her oluşturduğunuzda çalışmasını istiyorsanız, hedefinize bir derleme aşaması ekleyebilirsiniz:

  1. Proje dosyanıza gidin
  2. Hedefi seçin
  3. Derleme Aşamaları sekmesini tıklayın
  4. Bu bölmenin sağ alt köşesinde, 'Derleme Aşaması Ekle'yi tıklayın.
  5. 'Çalıştır Komut Dosyası Ekle'yi seçin
  6. Perl komut dosyanızı komut dosyanızın bölümüne sürükleyip bırakın. Şunun gibi görünmesi için değiştirin:
  1. cd $SRCROOT/licenses( $SRCROOTprojenizin köküne işaret eder)
  2. ./yourScriptName.pl

Bunu bitirdikten sonra, Run Scriptyapım aşamasını yapım sürecinde daha erken sürükleyebilirsiniz . Compile SourcesAyar Paketinizdeki güncellemelerin derlenip kopyalanması için daha önce yukarı taşımak isteyeceksiniz .

İOS 7 için güncelleme: iOS 7, "Başlık" anahtarını farklı şekilde işliyor gibi görünüyor ve oluşturulan metni karıştırıyor. Oluşturulan Acknowledgements.plist'in "Title" yerine "FooterText" anahtarını kullanması gerektiğini düzeltmek için. Komut dosyası şu şekilde değiştirilir:

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
Ne harika bir fikir! Bunu manuel olarak yapmaya başladım, özellikle de acımasız grup başlık uzunluğu sınırı nedeniyle otomatik bir çözüme ihtiyacım olduğunu hemen fark ettim.
Hilton Campbell

9
Dikkat edilmesi gereken bir şey var: "Dosya adı", anahtarın görüntü biçimidir. Gerçek anahtar "Dosya" dır. Alt bölme görünmüyorsa, sağ tıklayın ve "Ham Anahtarları / Değerleri Göster" i seçin ve anahtar adının "Dosya" olduğundan emin olun.
çatı katı

10
Bu harika, teşekkürler. Run Script bloğunda 'cd "$ SRCROOT / Licenses /"' kullandım, bu da bir projede birden fazla kişi çalışıyorsa biraz daha iyi çalışıyor.
chris

9
Bunu iOS7 ile kullanıyorsanız devforums.apple.com/message/894791#894791'i okuyun . Normal görünmesi için özellikle <key> Başlık </key> 'ı <key> FooterText </key> olarak değiştirmeniz gerekebilir.
esilver

2
Alt bölme nasıl yapılır: Tercih Öğeleri içinde Öğe 0 oluşturun. Görünüşe göre tür olarak Alt Bölmeyi seçemezsiniz, ancak yaptığınız şey Öğe 0 (Öğe 0'ın alt öğesi) altında bir öğe oluşturmak ve bu ilk öğenin "Tür" anahtarı vardır. Bunu kolaylaştırmak için, buna sağ tıklayın ve Ham Anahtarları / Değerleri Göster'i seçin. Type değerini PSChildPaneSpecifier olarak ayarlamak istiyorsunuz. Ham Anahtarları / Değerleri Göster ayarını kaldırdığınızda, artık Öğe 0 adında bile Alt Bölme, yani “0 (Alt Bölme -)” yazacaktır. Senin istediğin bu.
Marc

36

İşte @JosephH'nin sağladığı çözümün aynısı (çeviri olmadan), ancak python'u perl'e tercih eden herkes için Python'da yapıldı

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"
)

Bu yanıtın daha fazla oylamaya ihtiyacı var. Python sözdizimi <3Perl sözdizimi. ;)
Ricardo Sanchez-Saez

5
current_file = codecs.open(filename, 'r', 'utf-8')unicode lisansları için.
user2821144

Teşekkürler! Kartaca için harika olan buna dayalı yeni bir sürüm oluşturdum. Ayrıca, lisans metninden bazı gereksiz yeni satırları da kaldırır. Şuna
Zyphrax


15

Alternatif olarak, CocoaPods kullananlar için, Pod Dosyanızda belirtilen her hedef için, o hedefte kullanılan her bir Kapsül için Lisans ayrıntılarını içeren bir 'Onay' plist oluşturacaktır (ayrıntıların Kapsül özelliklerinde belirtildiği varsayılarak). İOS ayarları paketine eklenebilecek özellik listesi dosyası.

Bunun yerine, bu verilerin dönüştürülmesine ve uygulama içinde görüntülenmesine izin vermek için devam eden projeler de var:

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

https://github.com/cocoapods/CPDAcknowledgements


3
İşte bununla ilgili daha fazla bilgi: github.com/CocoaPods/CocoaPods/wiki/Acknowledgements
Oren

Cocoapods wiki'nin girdi dosyası adına Pods-Acknowledgements.plist olarak sahip olduğunu, ancak dosyanın aslında Pods-acknowledgements.plist (küçük 'a') olarak oluşturulduğunu unutmayın. Dosya sisteminiz büyük / küçük harfe duyarlıysa, yanlış büyük / küçük harf kullanımı pod yüklemesini bozacaktır.
Keller

14

Karışımdaki Sean'ın harika python koduna yinelememi atacağımı düşündüm. Temel fark, bir girdi dizini alması ve ardından tekrar tekrar LICENSE dosyaları için arama yapmasıdır. Başlık değerini LICENSE dosyasının üst dizininden türetir, böylece cocoapod'larla iyi oynar.

Motivasyon, bölmeleri eklerken veya kaldırırken uygulamamın yasal bölümünü otomatik olarak güncel tutmak için bir yapı komut dosyası oluşturmaktı. Ayrıca, zorunlu yeni satırları lisanslardan kaldırmak gibi başka şeyler de yapar, böylece paragraflar cihazlarda biraz daha iyi görünür.

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

görüntü açıklamasını buraya girin


8

Ruby'de @JosephH betiğinden esinlenerek bir senaryo hazırladım. Bu sürüm, bence, bireysel açık kaynak projelerini daha iyi temsil edecek.

Komut dosyasını ve örnek projeyi indirmek için Wisit iOS-AcknowledgementGenerator .

Onaylar, Uygulamanızda şöyle görünecektir:

Settings.app Settings.bundle Teşekkür görüntü açıklamasını buraya girin


2

Bu JosephH'nin cevabına bir ek. (Yorum yapacak bir temsilcim yok)

Perl senaryosunda <key>StringsTable</key> <string>Acknowledgements</string> aşağıya inmek zorunda kaldım </dict>.

Bu değişiklikten önce, Uygulamadaki Teşekkür Bölümü boştu ve XCode, sonuçta ortaya çıkan Acknowledgements.plist'i okuyamıyordu. ("Veriler doğru biçimde olmadığı için okunamadı.")

(XCode 6.3.2 iOS 8.3)


2

Bu iş parçacığındaki Sean'ın Python betiği çalışıyor. Ancak bilinmesi gereken birkaç temel şey var.

  1. Xcode'da, Proje Gezgini ağacının üst kısmına, projenizin adına sağ tıklayın ve Yeni Grup ekleyin. Bu, projenize yeni bir klasör koyar.
  2. Sean'ın komut dosyasını oraya ekleyin ve şu şekilde kaydettiğinizden emin olun: Acknowledgements.py.
  3. Sisteminizde Python'un kurulu olduğundan emin olun. Mac kullanıyorum.
  4. 1. adımında oluşturduğunuz klasöre bir ilk lisans dosyası ekleyin. Dosyada tek bir kelime olması gibi basitleştirin, diyelim ki: Test etme. Klasöre Test1.license olarak kaydedin.
  5. Settings.bundle'ınızı yukarıdaki JosephH'ye göre ayarlayın.
  6. Terminal uygulamanızı 1'de oluşturduğunuz klasöre CD olarak kullanın.
  7. Komut dosyasını çalıştırın. Şunu yazın: python Acknowledgements.py. Herhangi bir hata almazsanız, Terminal istemine geri dönecektir. Derlemeye herhangi bir çalıştırma betiği eklemeden önce bunların hepsini yapın.
  8. Uygulamanızı oluşturun ve çalıştırın.
  9. İPhone ana ekran düğmesine iki kez dokunun ve Ayarları öldürün. Ayarlar yeniden başlatılıncaya kadar genellikle uygulamanız için Ayarlar değişikliğini almaz.
  10. Ayarları yeniden başlattıktan sonra, uygulamanıza gidin ve çalışıp çalışmadığını kontrol edin.
  11. Bunların hepsi işe yaradıysa, yavaşça daha fazla lisans dosyası ekleyin, ancak komut dosyasını her seferinde çalıştırın. Dosyadaki belirli karakterler nedeniyle komut dosyasını çalıştırırken hatalar alabilirsiniz, bu nedenle hata ayıklamanın kolay yolu bir dosya eklemek, komut dosyasını çalıştırmak, çalışıp çalışmadığını görmek ve devam etmektir. Aksi takdirde, .license dosyasındaki tüm özel karakterleri düzenleyin.
  12. Yukarıdaki talimatlara göre Derleme Komut Dosyasını Çalıştır çalışmasını almadım. Ancak .license dosyalarını çok sık değiştirmiyorsanız, bu işlem sorunsuz çalışır.

1

Ack Ack: Acknowledgment Plist Generator
A daha önce lisans dosyalarını tarayan ve Settings.plist içinde kullanabileceğiniz güzel bir Acknowledgments plist oluşturan bir Python betiği oluşturdum. Sizin için pek çok işi yapar.

https://github.com/Building42/AckAck

Özellikleri

  • Carthage ve CocoaPods klasörlerini algılar
  • Özel lisanslar için mevcut listeleri tespit eder
  • Gereksiz yeni satırları ve satır sonlarını kaldırarak lisans metinlerini temizler
  • Birçok özelleştirme seçeneği sunar ( --helpayrıntılar için bkz .)
  • Hem Python v2 hem de v3'ü destekler

Yüklemek

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

Çalıştırmak

./ackack.py

Ekran görüntüsü

Teşekkür

İyileştirme önerileriniz varsa, GitHub'da bir sorun yayınlamaktan veya talepte bulunmaktan çekinmeyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.