найкращий спосіб додати розділ ліцензій до пакета налаштувань 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.

Здається, є розумним прецедентом для розміщення цієї інформації під підрозділом "Ліцензія" в наборі налаштувань (на Facebook, ipad facebook, сторінки, основний текст, цифри та wikipanion, схоже, це роблять).

Я трохи борюся, щоб насправді досягти того самого; Мені здається, потрібно розділити текст за рядком і ввести в xcode рядок за один раз (а xcode4, здається, має проблеми з збоєм під час редагування списків).

Здається, що це те, що майже напевно десь слід зробити сценарій, або якийсь простий спосіб зробити це, що я пропустив.

Відповіді:


192

Я думаю, що мені зараз вдалося вирішити всі проблеми, з якими я стикався.

  • Здається, найкраще використовувати заголовки групових елементів для зберігання ліцензій (це те, що Apple робить у додатках iWork). Однак існує тривалість обмеження (і я ще не виявив, що саме є лімітом), тому вам потрібно розбити кожен файл ліцензії на кілька рядків.
  • Ви можете створити розрив рядка в межах цього, включивши буквальне повернення каретки (тобто інше відоме як ^ M, \ r або 0x0A)
  • Переконайтеся, що не включайте будь-який буквальний "середині" тексту. Якщо це зробити, деякі або всі рядки у файлі будуть мовчазно ігноровані.

У мене є зручний сценарій, який я використовую для створення файлів .plist та .strings, показаних нижче.

Щоб використовувати його:

  1. Створіть у своєму проекті каталог "ліцензій"
  2. Покладіть скрипт у цей каталог
  3. Введіть кожну ліцензію в цей каталог, по одній на файл, з іменами, що закінчуються .license
  4. Виконайте будь-яке необхідне переформатування ліцензій. (наприклад, видаліть зайві пробіли на початку рядків, переконайтеся, що в середині абзацу немає розривів рядків). Між кожним абзацом має бути порожній рядок
  5. Перейдіть до каталогу ліцензій та запустіть сценарій
  6. Відредагуйте пакет налаштувань Root.plist, щоб включити дочірній розділ під назвою "Подяки"

Ось сценарій:

#!/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, перейдіть до Файл -> Новий -> Новий файл ...

У розділі "Ресурси" знайдіть "Налаштування". Використовуйте ім'я за замовчуванням і збережіть його в корені проекту.

Розгорніть Settings.bundleгрупу та виберіть Root.plist. Вам потрібно буде додати новий розділ, де його ключ буде Preference Itemsтип Array. Додайте таку інформацію:

введіть тут опис зображення

У Filenameключові моменти до PLIST , який був створений цей сценарій. Ви можете змінити те, titleщо вам завгодно.

Виконати сценарій у час збирання

Крім того, якщо ви хочете, щоб цей сценарій запускався щоразу, коли ви створюєте проект, ви можете додати фазу збірки до своєї цілі:

  1. Перейдіть до файлу проекту
  2. Виберіть ціль
  3. Перейдіть на вкладку Фази збірки
  4. У нижньому правому куті цієї області натисніть "Додати фазу збірки"
  5. Виберіть "Додати сценарій запуску"
  6. Перетягніть сценарій perl в розділ для вашого сценарію. Змініть так, щоб виглядати приблизно так:
  1. cd $SRCROOT/licenses( $SRCROOTвказує на корінь вашого проекту)
  2. ./yourScriptName.pl

Після цього ви зможете Run Scriptшвидше перетягнути фазу збірки в процесі збирання. Ви хочете перенести його вгору раніше, Compile Sourcesщоб оновлення вашого пакета налаштувань збиралися та копіювалися заново.

Оновлення для iOS 7: Схоже, iOS 7 обробляє клавішу "Назва" різною і псує виведений текст. Щоб визначити, що для створеного 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
Яка фантастична ідея! Я почав це робити вручну, перш ніж швидко зрозумів, що мені потрібно автоматизоване рішення, особливо через обмеження довжини заголовка драконівської групи.
Хілтон Кемпбелл

9
На що слід звернути увагу: "Ім'я файлу" - це форма відображення ключа. Фактичний ключ - "Файл". Якщо дочірня панель не відображається, клацніть правою кнопкою миші та виберіть "Показати сировинні ключі / значення" та переконайтесь, що ключове ім'я - "Файл".
atticus

10
Це фантастично, дякую. Я використав 'cd "$ SRCROOT / Licitions /"' у блоці Run Script, який працює трохи краще, якщо у вас є кілька людей, які працюють над проектом.
chris

9
Прочитайте devforums.apple.com/message/894791#894791, якщо ви використовуєте це з iOS7. Зокрема, вам може знадобитися змінити <key> Заголовок </key> на <key> FooterText </key>, щоб він виглядав нормально.
esilver

2
Як зробити це дочірньою панеллю: Створіть пункт 0 всередині параметрів налаштування. Схоже, ви не можете вибрати дочірню панель як тип, але те, що ви робите, це створити елемент під пунктом 0 (s підпункт пункту 0), і цей перший елемент має клавішу "Тип". Щоб зробити це легше, клацніть правою кнопкою миші та виберіть Показати сировинні ключі / цінності. Ви хочете встановити значення для типу "PSChildPaneSpecifier". Після того як ви вимкнете показ "Сирих клавіш / значень", тепер він буде вимовляти дочірню панель, навіть у назві для пункту 0, тобто "0" (дочірня панель -). Це те, що ти хочеш.
Марк

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. ;)
Рікардо Санчес-Саес

5
current_file = codecs.open(filename, 'r', 'utf-8')для ліцензій unicode.
користувач2821144

Дякую! Я створив нову версію на основі цієї, яка чудово підходить для Карфагена. Він також видаляє деякі зайві нові рядки з тексту ліцензії. Перевірте це: gist.github.com/Zyphrax/0d015c618d46093b4f815e62a6a33969
Zyphrax

1
Я трохи більше поклав на це роботу, дивіться: github.com/Building42/AckAck
Zyphrax

15

В якості альтернативи, для тих, хто використовує CocoaPods, він генерує список "Підтвердження" для кожної цілі, вказаної у вашому Podfile, який містить дані про ліцензію для кожного Pod, використовуваного в цій цілі (якщо припустити, що деталі були визначені у специфікації Pod). Файл списку властивостей, який можна додати в комплект налаштувань iOS.

Також ведуться проекти, які дозволять замість цього перетворити та відобразити ці дані в додатку:

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

https://github.com/cocoapods/CPDAвизнання


3
Ось більш детальна інформація про це: github.com/CocoaPods/CocoaPods/wiki/Підтвердження
Орен

Майте на увазі, що вікі Cocoapods має ім'я вхідного файлу як Pods-Acknowledgements.plist, але файл насправді генерується як Pods-визнання.plist (нижній регістр 'a'). Використання неправильного випадку порушить встановлення pod, якщо ваша файлова система відрізняється від регістру.
Келлер

14

Я думав, що кину свою ітерацію на дивовижний код Штона в суміші. Основна відмінність полягає в тому, що він бере вхідний каталог, а потім рекурсивно шукає його для файлів LICENSE. Він отримує значення заголовка з батьківського каталогу файлу LICENSE, тому він добре грає з cocoapods.

Мотивація полягала в тому, щоб створити сценарій збірки, щоб автоматично оновлювати юридичний розділ мого додатка, коли я додаю або видаляю стручки. Це також робить деякі інші речі, як видалення вимушених нових рядків з ліцензій, тому абзаци виглядають трохи краще на пристроях.

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

введіть тут опис зображення


8

Я створив сценарій у Рубі натхненний сценарієм @JosephH. Ця версія, на мою думку, буде краще представляти окремі проекти з відкритим кодом.

Завантажте iOS-AcknowledgementGenerator, щоб завантажити сценарій та зразок проекту.

Ось як виглядатимуть підтвердження у вашому додатку:

Settings.app Settings.bundle Подяка введіть тут опис зображення


2

Це доповнення до відповіді Йосифа. (У мене немає коментаря для коментаря)

Мені довелося рухатися <key>StringsTable</key> <string>Acknowledgements</string> вниз до останнього </dict>в сценарії Perl.

Перед цією модифікацією розділ «Підтвердження» в додатку був порожнім, і XCode не зміг прочитати отриманий список підтвердження.plist. ("Дані не вдалося прочитати, оскільки вони не в правильному форматі.")

(XCode 6.3.2 iOS 8.3)


2

Сценарій Python від Шона в цій темі працює. Але є кілька основних речей, які потрібно знати.

  1. у Xcode клацніть правою кнопкою миші у верхній частині дерева Навігатора проектів, назви проекту та додайте Нову групу. Це додає нову папку у ваш проект.
  2. Додайте туди сценарій Шона і переконайтесь, що він збережеться як: Acknowledgements.py.
  3. Переконайтеся, що у вашій системі встановлений Python. Я використовую Mac.
  4. Додайте перший файл ліцензії до папки, яку ви створили в 1. Зробити це просто, як просто мати одне слово у файлі, скажімо: Тестування. Збережіть його у папці як Test1.license.
  5. Налаштуйте свій Settings.bundle, як описано вище JosephH.
  6. Використовуйте додаток Terminal для компакт-дисків у папці, створеній у 1.
  7. Запустіть сценарій. Тип: python Acknowledgements.py. Якщо у вас не буде помилок, він повернеться прямо до підказки терміналу. Зробіть усе це, перш ніж додавати будь-який сценарій запуску до збірки.
  8. Створіть і запустіть додаток.
  9. Двічі торкніться домашньої кнопки iPhone та вбийте "Налаштування". Він не часто підбирає зміни налаштувань для вашого додатка, поки налаштування не перезапуститься.
  10. Після перезапуску "Налаштувань" перейдіть до свого додатка і подивіться, чи працює він.
  11. Якщо все це спрацювало, повільно додайте більше ліцензійних файлів, але запускайте сценарій кожен раз. Ви можете отримати помилки під час виконання сценарію через певні символи у файлі, тому найпростіший спосіб налагодження - додати файл, запустити скрипт, побачити, чи він працював і продовжувати. В іншому випадку відредагуйте будь-які спеціальні символи з .license-файлу.
  12. Я не отримав роботу Run Build Script відповідно до наведених вище інструкцій. Але цей процес працює добре, якщо ви часто не змінюєте файли .license.

1

Ack Ack: Генератор списків підтвердження
. Коли я повернувся назад, я створив сценарій Python, який сканує ліцензійні файли та створює приємний плейлист «Підтвердження», який ви можете використовувати у своєму Settings.plist. Це робить багато роботи для вас.

https://github.com/Building42/AckAck

Особливості

  • Виявляє папки Carthage та CocoaPods
  • Виявляє наявні списки користувацьких ліцензій
  • Очищує тексти ліцензій, видаляючи непотрібні нові рядки та розриви рядків
  • Надає безліч варіантів налаштування (див. --helpДетальну інформацію)
  • Підтримує і Python v2 і v3

Встановити

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

Біжи

./ackack.py

Знімок екрана

Подяка

Якщо у вас є пропозиції щодо вдосконалень, не соромтесь опублікувати проблему або надіслати запит на GitHub!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.