лучший способ добавить лицензионный раздел в комплект настроек iOS - PullRequest
114 голосов
/ 21 июня 2011

В моем приложении для 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, похоже, имеет проблему сбоя при редактировании списков).

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

Ответы [ 7 ]

191 голосов
/ 23 июня 2011

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

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

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

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

  1. Создайте каталог 'licenses' в вашем проекте
  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. Добавьте следующую информацию:

enter image description here

Клавиша Filename указывает на список, созданный этим сценарием. Вы можете изменить 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);
}
36 голосов
/ 24 января 2014

Вот то же решение, которое предоставил @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"
)
15 голосов
/ 07 марта 2014

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

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

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

https://github.com/cocoapods/CPDAcknowledgements

13 голосов
/ 15 сентября 2014

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

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

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

enter image description here

8 голосов
/ 07 февраля 2014

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

Wisit iOS-AcknowledgementGenerator для загрузки сценария и примера проекта.

Вот как будут выглядеть подтверждения в вашем приложении:

Settings.app Settings.bundle Acknowledgements enter image description here

2 голосов
/ 29 февраля 2016

Сценарий Python от Шона в этой теме работает.Но есть несколько основных вещей, которые нужно знать.

  1. в Xcode, щелкните правой кнопкой мыши в верхней части дерева Project Navigator, на имени вашего проекта и добавьте новую группу.Это создаст новую папку в вашем проекте.
  2. Добавьте туда сценарий Шона и сохраните его как: Acknowledgements.py.
  3. Убедитесь, что в вашей системе установлен Python.Я использую Mac.
  4. Добавьте первый файл лицензии в папку, которую вы создали в 1. Сделайте это просто, как одно слово в файле, скажем: Тестирование.Сохраните его в папке под именем Test1.license.
  5. Настройте пакет Settings.bundle в соответствии с указанным выше JosephH.
  6. Используйте приложение терминала на компакт-диске в папку, созданную в 1.
  7. Запустите скрипт.Тип: python Acknowledgements.py.Если вы не получите ошибок, он вернется обратно к терминалу.Сделайте все это перед добавлением любого скрипта запуска в Build.
  8. Создайте и запустите ваше приложение.
  9. Дважды нажмите на домашнюю кнопку iPhone и убейте Настройки.Это не часто принимает изменения настроек для вашего приложения, пока настройки не перезапустятся.
  10. После перезапуска настроек перейдите в свое приложение и посмотрите, работает ли оно.
  11. Если все это работает, медленно добавляйте дополнительные файлы лицензий, но каждый раз запускайте скрипт.Вы можете получить ошибки при запуске скрипта из-за определенных символов в файле, поэтому простой способ отладки - добавить файл, запустить скрипт, посмотреть, работает ли он и продолжить.Иначе, отредактируйте любые специальные символы из файла .license.
  12. Я не получил работу Run Build Script в соответствии с инструкциями выше.Но этот процесс работает нормально, если вы не меняете файлы .license так часто.
2 голосов
/ 25 мая 2015

Это дополнение к ответу Иосифа. (У меня нет представителя, чтобы комментировать)

Я должен был двигаться <key>StringsTable</key> <string>Acknowledgements</string> вплоть до последнего </dict> в скрипте Perl.

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

(XCode 6.3.2 iOS 8.3)

...