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.

この情報を設定バンドルの「ライセンス」サブエントリの下に置くための合理的な先例があるようです(iPadのFacebook、ページ、基調講演、数字、Wikipanionで、すべてこれを行うようです)。

私は実際に同じことを達成するために少し苦労しています。テキストを1行ずつ分割して、一度に1行ずつxcodeに入力する必要があるようです(plistの編集時にxcode4がクラッシュする問題があるようです)。

確かに、どこかでスクリプトを実行する必要があるようなものや、私が見逃した簡単な方法があるようです。

回答:


192

私は今、私が遭遇していたすべての問題を解決することができたと思います。

  • グループ要素のタイトルを使用してライセンスを保持するのが最善のようです(これはAppleがiWorkアプリで行うことです)。ただし、これらの長さには制限があり(その制限がまだ正確にわかっていません)、各ライセンスファイルを複数の文字列に分割する必要があります。
  • これらの中に改行を作成するには、リテラルのキャリッジリターンを含めます(つまり、^ M、\ r、または0x0Aとも呼ばれます)。
  • リテラル "のミッドテキストを含めないでください。含めると、ファイル内の一部またはすべての文字列が暗黙的に無視されます。

以下に示す.plistファイルと.stringsファイルの生成に使用する便利なスクリプトがあります。

それを使用するには:

  1. プロジェクトの下に「licenses」ディレクトリを作成します
  2. スクリプトをそのディレクトリに置きます
  3. 各ライセンスをファイルごとに1つ、そのファイル名が.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 Itemstypeになる新しいセクションを追加する必要があり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が「Title」ではなく「FooterText」キーを使用する必要があります。このスクリプトの変更方法:

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
注意すべきことの1つ:「ファイル名」はキーの表示形式です。実際のキーは「ファイル」です。子ペインが表示されない場合は、右クリックして[未加工のキー/値を表示]を選択し、キー名が "ファイル"であることを確認します。
atticus

10
これは素晴らしいです、ありがとう。スクリプトの実行ブロックで「cd "$ SRCROOT / Licenses /"」を使用しました。これは、プロジェクトで複数の人が作業している場合に少しうまくいきます。
chris

9
読むdevforums.apple.com/message/894791#894791あなたはiOS7でこれを使用している場合。具体的には、<key> Title </ key>を<key> FooterText </ key>に変更して、正常に見えるようにする必要があります。
esilver 2013

2
子ペインにする方法:設定項目内に項目0を作成します。タイプとして子ペインを選択できないようですが、行うのはアイテム0(アイテム0のサブアイテム)の下にアイテムを作成し、その最初のアイテムにキー「タイプ」があります。簡単にするために、これを右クリックして[未加工のキー/値を表示]を選択します。Typeの値をPSChildPaneSpecifierに設定するとします。[未加工のキー/値の表示]の設定を解除すると、アイテム0の名前、つまり「Its 0(Child Pane-)」でも、Child Paneと表示されます。これはあなたが望むものです。
Marc

36

@JosephHが(翻訳なしで)提供したものと同じソリューションですが、perlよりもpythonを好む人のためにPythonで実行されました

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構文。;)
リカルドサンチェス-サエズ2014年

5
current_file = codecs.open(filename, 'r', 'utf-8')Unicodeライセンスの場合。
user2821144

ありがとう!私はこれに基づいてカーセージに最適な新しいバージョンを作成しました。また、ライセンステキストから不要な改行が削除されます。チェックしてみてください:gist.github.com/Zyphrax/0d015c618d46093b4f815e62a6a33969
Zyphrax

1
もう少し作業を加えました。次を参照してください:github.com/Building42/AckAck
Zyphrax

15

別の方法として、CocoaPodsを使用している場合は、Podfileで指定された各ターゲットの「確認応答」plistを生成します。このリストには、そのターゲットで使用される各ポッドのライセンスの詳細が含まれます(詳細はポッド仕様で指定されているものとします)。iOS設定バンドルに追加できるプロパティリストファイル。

代わりに、このデータを変換してアプリ内に表示できるようにするプロジェクトも進行中です。

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

https://github.com/cocoapods/CPDAcknowledgements


3
詳しくは、github.com
Oren

Cocoapods wikiの入力ファイル名はPods-Acknowledgements.plistですが、ファイルは実際にはPods-acknowledgements.plist(小文字の 'a')として生成されることに注意してください。ファイルシステムで大文字と小文字が区別される場合、間違った大文字と小文字を使用すると、ポッドのインストールが中断されます。
ケラー

14

私はショーンの素晴らしいpythonコードをミックスに入れて自分のイテレーションを投げると思いました。主な違いは、入力ディレクトリを取得し、それからLICENSEファイルを再帰的に検索することです。タイトル値はLICENSEファイルの親ディレクトリから取得されるため、cocoapodsでうまく機能します。

動機は、ポッドを追加または削除したときに、アプリの法的セクションを自動的に最新の状態に保つビルドスクリプトを作成することでした。また、ライセンスから強制改行を削除するなど、他のいくつかの処理も実行するため、デバイス上で段落が少し見やすくなります。

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

ここに画像の説明を入力してください


8

@JosephHスクリプトを挿入してRubyでスクリプトを作成しました。私の意見では、このバージョンは、個々のオープンソースプロジェクトをよりよく表すと思います。

iOS-AcknowledgementGeneratorにアクセスして、スクリプトとサンプルプロジェクトをダウンロードします。

これは、アプリケーションでの確認応答のようになります。

Settings.app Settings.bundle 謝辞 ここに画像の説明を入力してください


2

これは、JosephHの回答の補足です。(コメントする担当者がいません)

Perlスクリプトで<key>StringsTable</key> <string>Acknowledgements</string> 最後の1つ上に移動 する必要がありました</dict>

この変更の前は、アプリの確認セクションは空であり、XCodeは結果のAcknowledgements.plistを読み取ることができませんでした。(「正しい形式ではないため、データを読み取ることができませんでした。」)

(XCode 6.3.2 iOS 8.3)


2

このスレッドのSeanによるPythonスクリプトが機能します。しかし、知っておくべき基本的なことがいくつかあります。

  1. Xcodeで、プロジェクト名のプロジェクトナビゲーターツリーの上部を右クリックし、新しいグループを追加します。これにより、プロジェクトに新しいフォルダーが配置されます。
  2. そこにSea​​nのスクリプトを追加し、Acknowledgements.pyという名前で保存してください。
  3. システムにPythonがインストールされていることを確認してください。Macを使用しています。
  4. 1で作成したフォルダーに最初のライセンスファイルを追加します。ファイルに1つの単語を含めるだけのように簡単にします。フォルダーにTest1.licenseとして保存します。
  5. 上記のJosephHに従って、Settings.bundleを設定します。
  6. ターミナルアプリを使用して、1で作成したフォルダーにCDを作成します。
  7. スクリプトを実行します。タイプ:python Acknowledgements.py。エラーが発生しなければ、ターミナルプロンプトに戻ります。ビルドに実行スクリプトを追加する前に、これらすべてを実行してください。
  8. アプリをビルドして実行します。
  9. iPhoneのホームボタンをダブルタップして、設定を終了します。設定が再起動するまで、アプリの設定変更が反映されないことがよくあります。
  10. 設定を再起動したら、アプリに移動して、機能するかどうかを確認します。
  11. すべてがうまくいった場合は、ゆっくりとライセンスファイルを追加しますが、毎回スクリプトを実行します。ファイル内の特定の文字が原因でスクリプトの実行中にエラーが発生する可能性があるため、デバッグする簡単な方法は、ファイルを追加してスクリプトを実行し、機能するかどうかを確認して続行することです。それ以外の場合は、.licenseファイルから特殊文字を編集します。
  12. 上記の指示に従って、ビルドスクリプトの実行が機能しませんでした。ただし、.licenseファイルを頻繁に変更しない場合、このプロセスは正常に機能します。

1

Ack Ack:Acknowledgement Plist Generator
A戻って、ライセンスファイルをスキャンして、Settings.plistで使用できる素敵なAcknowledgement plistを作成するPythonスクリプトを作成しました。それはあなたのために多くの仕事をします。

https://github.com/Building42/AckAck

特徴

  • CarthageおよびCocoaPodsフォルダーを検出します
  • カスタムライセンスの既存のplistを検出します
  • 不要な新しい行と改行を削除して、ライセンステキストをクリーンアップします
  • 多くのカスタマイズオプションを提供します(詳細は--helpを参照)
  • Python v2とv3の両方をサポート

インストール

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

走る

./ackack.py

スクリーンショット

謝辞

改善の提案がある場合は、GitHubに問題やプルリクエストを投稿してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.