web-dev-qa-db-ja.com

ライセンスセクションを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、ページ、基調講演、数字、ウィキパニオンではすべてこれを行うようです)。

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

ほぼ確実にどこかで実行するスクリプト、または私が見逃した簡単な方法があるように思えます。

114
JosephH

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

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

以下に示す.plistおよび.stringsファイルの生成に役立つ便利なスクリプトがあります。

使用するには:

  1. プロジェクトの下に「ライセンス」ディレクトリを作成します
  2. そのディレクトリにスクリプトを入れます
  3. .licenseで終わるファイル名で、ファイルごとに1つずつ、そのディレクトリに各ライセンスを配置します。
  4. ライセンスで必要な再フォーマットを実行します。 (たとえば、行頭の余分なスペースを削除し、段落の途中で改行しないようにします)。各段落の間に空白行が必要です
  5. ライセンスディレクトリに変更し、スクリプトを実行します
  6. 設定バンドルRoot.plistを編集して、「Acknowledgements」という子セクションを含めます

スクリプトは次のとおりです。

#!/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を選択します。キーがArray型のPreference Itemsになる新しいセクションを追加する必要があります。次の情報を追加します。

enter image description here

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」キーを使用する必要があります。このスクリプトの変更方法:

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

@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"
)
36
Sean

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

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

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

https://github.com/cocoapods/CPDAcknowledgements

15
JosephH

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

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

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

enter image description here

13
carloe

スクリプトを作成しましたRuby @JosephHスクリプトによってインスパイアされました。このバージョンは、私自身の意見では、個々のオープンソースプロジェクトをよりよく表現します。

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

これは、承認がアプリでどのように見えるかです:

Settings.appSettings.bundleAcknowledgementsenter image description here

8
cvknage

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

移動する必要がありました<key>StringsTable</key> <string>Acknowledgements</string>下から最後まで</dict> Perlスクリプト内。

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

(XCode 6.3.2 iOS 8.3)

2
mattti

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

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

Ack Ack:Acknowledgement Plist Generator
しばらく前に、Pythonライセンスファイルをスキャンし、Settings.plistで使用できるNice Acknowledgments plistを作成するスクリプトを作成しました。あなたのための仕事。

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

スクリーンショット

Acknowledgements

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

0
Zyphrax