Подтвердить что ты не робот

Лучший способ добавить лицензионный раздел в набор настроек iOS

В моем приложении 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, pages, keynote, numbers и wikipanion все это похоже на это).

Я немного борюсь, чтобы на самом деле добиться того же; Кажется, мне нужно разбить текст вверх по строке и ввести в xcode строку за раз (и xcode4, похоже, имеет проблемы с сбоем при редактировании plists).

Похоже на то, что почти наверняка есть где-нибудь script, или какой-то простой способ сделать это, что я пропустил.

4b9b3361

Ответ 1

Думаю, мне удалось решить все проблемы, с которыми я столкнулся.

  • Кажется, лучше использовать названия элементов группы для хранения лицензий (это то, что Apple делает в приложениях iWork). Тем не менее существует ограничение на длину этих (и я еще не обнаружил, что такое предел), поэтому вам нужно разбить каждый файл лицензии на несколько строк.
  • Вы можете создать разрыв строки внутри них, включив литеральный возврат каретки (то есть иначе известный как ^ M,\r или 0x0A)
  • Обязательно не включайте текстовый текст в буквальном формате. Если вы это сделаете, некоторые или все строки в файле будут игнорироваться.

У меня есть удобство script Я использую, чтобы сгенерировать файл .plist и .strings, показанный ниже.

Чтобы использовать его:

  • Создайте каталог "лицензий" в вашем проекте
  • Поместите script в этот каталог
  • Поместите каждую лицензию в этот каталог, по одному на файл, с именами файлов, которые заканчиваются .license
  • Выполните необходимые переформатирования лицензий. (например, удалите лишние пробелы в начале строк, убедитесь, что нет промежуточных абзацев строк). Между каждым абзацем должна быть пустая строка.
  • Перейдите в каталог лицензий и запустите script
  • Отредактируйте свой набор параметров Root.plist, чтобы включить дочерний раздел под названием "Благодарности"

Здесь script:

#!/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. Добавьте следующую информацию:

enter image description here

Ключ Filename указывает на plist, который был создан этим script. Вы можете изменить title на то, что захотите.

Выполнить script Время сборки

Кроме того, если вы хотите, чтобы этот script запускался всякий раз, когда вы строите проект, вы можете добавить фазу сборки к своей цели:

  • Перейдите в файл проекта
  • Выберите цель
  • Перейдите на вкладку "Фазы построения"
  • В правом нижнем углу этой панели нажмите "Добавить фазу сборки"
  • Выберите 'Add Run Script'
  • Перетащите свой perl script в раздел для script. Измените, чтобы выглядеть примерно так:
  • cd $SRCROOT/licenses ($SRCROOT указывает на корень вашего проекта)
  • ./yourScriptName.pl

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

Обновление для iOS 7: iOS 7, по-видимому, обрабатывает ключ "Заголовок", а также испортил визуализированный текст. Чтобы исправить то, что сгенерированный Acknowledgements.plist должен использовать клавишу "FooterText" вместо "Title". Это как изменить script:

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);
}

Ответ 2

Здесь же решение, которое @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"
)

Ответ 3

В качестве альтернативы, для тех, кто использует CocoaPods, он будет генерировать "Acknowledgements" plist для каждой цели, указанной в вашем подфайле, который содержит сведения о лицензии для каждого Pod, используемого в этой цели (при условии, что детали указаны в спецификации Pod), Файл списка свойств, который можно добавить в набор настроек iOS.

Также существуют проекты, позволяющие вместо этих данных преобразовывать и отображать в приложении:

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

https://github.com/cocoapods/CPDAcknowledgements

Ответ 4

Я думал, что я выброшу свою итерацию на Sean удивительный код python в миксе. Основное отличие состоит в том, что он принимает входной каталог, а затем рекурсивно ищет его для файлов LICENSE. Он получает значение заголовка из родительского каталога файла LICENSE, поэтому он хорошо работает с cocoapods.

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

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

enter image description here

Ответ 5

Я сделал script в Ruby, вдохновленный @JosephH script. Эта версия, по моему мнению, лучше будет представлять отдельные проекты с открытым исходным кодом.

Wisit iOS-AcknowledgementGenerator загрузить script и образец проекта.

Вот что должно получиться в вашем приложении:

Settings.appSettings.bundleAcknowledgementsenter image description here

Ответ 6

Это дополнение к ответу JosephH. (У меня нет комментариев для комментариев)

Мне пришлось двигаться <key>StringsTable</key> <string>Acknowledgements</string> вплоть до последнего </dict> в Perl script.

До этой модификации раздел "Благодарности" в приложении был пуст, и XCode не смог прочитать полученный Acknowledgements.plist. ( "Данные не могут быть прочитаны, потому что они не в правильном формате".)

(XCode 6.3.2 iOS 8.3)

Ответ 7

В этом потоке работает Python script от Sean. Но есть пара основных вещей, которые нужно знать.

  • в Xcode, щелкните правой кнопкой мыши в верхней части дерева Project Navigator, на название вашего проекта и добавьте новую группу. Это добавляет новую папку в ваш проект.
  • Добавьте Sean script и сохраните его как: Acknowledgements.py.
  • Убедитесь, что в вашей системе установлен Python. Я использую Mac.
  • Добавьте первый файл лицензии в созданную вами папку 1. Сделайте это простым, просто имея одно слово в файле, скажем: Тестирование. Сохраните его в папке как Test1.license.
  • Настройте свой Settings.bundle в соответствии с Джозефом выше.
  • Используйте приложение "Терминал" на компакт-диске в папку, созданную в 1.
  • Запустите script. Тип: python Acknowledgements.py. Если вы не получите никаких ошибок, он вернется обратно в приглашение терминала. Сделайте все это до добавления любого запуска script в сборку.
  • Создайте и запустите приложение.
  • Дважды нажмите кнопку "iPhone home" и нажмите "Настройки". Он не часто выбирает изменения настроек для вашего приложения, пока не перезапустятся настройки.
  • После перезагрузки настроек перейдите в свое приложение и посмотрите, не работает ли он.
  • Если все это сработало, медленно добавляйте больше файлов лицензий, но каждый раз запускайте script. Вы можете получить ошибки, запускающие script из-за определенных символов в файле, поэтому простой способ отладки - это добавить файл, запустите script, посмотрите, работает ли он и продолжайте. Else, отредактируйте любые специальные символы из файла .license.
  • Я не получил работу Run Build script в соответствии с приведенными выше инструкциями. Но этот процесс отлично работает, если вы не часто меняете файлы .license.

Ответ 8

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

Run

./ackack.py

Скриншот

Acknowledgements

Если у вас есть предложения по улучшению, не стесняйтесь размещать проблемы или тянуть запрос на GitHub!