アプリケーションの設定バンドルでアプリケーションのバージョン リビジョンを表示するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/877128

質問

アプリケーションの設定バンドルに、アプリケーションのバージョンと内部リビジョン (1.0.1 (r1243) など) を含めたいと考えています。

Root.plist ファイルには次のようなフラグメントが含まれています...

     <dict>
        <key>Type</key>
        <string>PSTitleValueSpecifier</string>
        <key>Title</key>
        <string>Version</string>
        <key>Key</key>
        <string>version_preference</string>
        <key>DefaultValue</key>
        <string>VersionValue</string>
        <key>Values</key>
        <array>
            <string>VersionValue</string>
        </array>
        <key>Titles</key>
        <array>
            <string>VersionValue</string>
        </array>
    </dict>

ビルド時に「VersionValue」文字列を置き換えたいと思います。

リポジトリからバージョン番号を抽出できるスクリプトがあります。必要なのは、ビルド時に Root.plist ファイルを処理 (前処理) し、ソース ファイルに影響を与えずにリビジョン番号を置き換える方法です。

役に立ちましたか?

解決 7

pListcompiler (http://sourceforge.net/projects/plistcompiler) オープンソース プロジェクト。

  1. このコンパイラを使用すると、次の形式でプロパティ ファイルを .plc ファイルに書き込むことができます。

    plist {
        dictionary {
            key "StringsTable" value string "Root"
            key "PreferenceSpecifiers" value array [
                dictionary {
                    key "Type" value string "PSGroupSpecifier"
                    key "Title" value string "AboutSection"
                }
                dictionary {
                    key "Type" value string "PSTitleValueSpecifier"
                    key "Title" value string "Version"
                    key "Key" value string "version"
                    key "DefaultValue" value string "VersionValue"
                    key "Values" value array [
                        string "VersionValue"
                    ]
                    key "Titles" value array [
                        string "r" kRevisionNumber
                    ]
                }
            ]
        }
    }
    
  2. brad-larson が説明したように、リポジトリのリビジョンを .h ファイルに抽出するカスタム実行スクリプトのビルドフェーズがありました。 ここ.

  3. plc ファイルには、#define、#message、#if、#elif、#include、#warning、#ifdef、#else、#pragma、#error、#ifndef、#endif、xcode 環境変数などのプリプロセッサ ディレクティブを含めることができます。そこで、次のディレクティブを追加することで、変数 kRevisionNumber を参照できました。

    #include "Revision.h"
    
  4. また、プロジェクトがビルドされるたびに plcompiler を実行するために、xcode ターゲットにカスタム スクリプトのビルド フェーズを追加しました。

    /usr/local/plistcompiler0.6/plcompile -dest Settings.bundle -o Root.plist Settings.plc
    

それで終わりました!

他のヒント

前の回答のいずれよりもはるかに単純なことができ、別の解決策があります。 Appleはインストーラの最も内側のPlistBuddyのと呼ばれるコマンドラインツールをバンドルし、/usr/libexec/PlistBuddyでLeopardでそれを含めています。

あなたがVersionValueに抽出バージョン値を持っていると仮定すると、$newVersionを交換したいので、あなたは、このコマンドを使用することができます:

/usr/libexec/PlistBuddy -c "Set :VersionValue $newVersion" /path/to/Root.plist

のsedや正規表現をいじるする必要はありません、このアプローチは非常に簡単ではありません。詳細な手順については、 manページを参照してください。あなたは、追加、削除、またはプロパティリスト内のエントリを変更するためにPlistBuddyを使用することができます。例えば、私の友人は、についてブログ/> PlistBuddyを使用します。

注:あなたのplistにだけパスを供給した場合は、変更内容を保存することを決定する前に、複数のコマンドを発行することができますので、PlistBuddyは、対話モードに入ります。私は間違いなくあなたのビルドスクリプトでそれをplopping前にこれを行うことをお勧めします。

私の怠惰な人間のソリューションは、私のアプリケーションコードからバージョン番号を更新しました。あなたはRoot.plistのデフォルト(または空白)値を持っている可能性があり、その後、どこかのスタートアップコードでます:

NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
[[NSUserDefaults standardUserDefaults] setObject:version forKey:@"version_preference"];

唯一の難点は、あなたのアプリが設定パネルに表示されるように更新されたバージョンのために少なくとも1回実行する必要があることです。

あなたは、例えば、さらに、更新にアプリが起動、または他の情報の興味深いビットされた回数のカウンタをアイデアを取ることができます。

@Quinnの回答に基づいて、これを行うために使用する完全なプロセスと作業コードをここに示します。

  • 設定バンドルをアプリに追加します。名前を変更しないでください。
  • テキストエディタでSettings.bundle/Root.plistを開きます。

内容を次のように置き換えます。

<?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>PreferenceSpecifiers</key>
    <array>
        <dict>
            <key>Title</key>
            <string>About</string>
            <key>Type</key>
            <string>PSGroupSpecifier</string>
        </dict>
        <dict>
            <key>DefaultValue</key>
            <string>DummyVersion</string>
            <key>Key</key>
            <string>version_preference</string>
            <key>Title</key>
            <string>Version</string>
            <key>Type</key>
            <string>PSTitleValueSpecifier</string>
        </dict>
    </array>
    <key>StringsTable</key>
    <string>Root</string>
</dict>
</plist>
  • を作成します スクリプトの実行 構築フェーズ、その後に移動します バンドルリソースのコピー 段階。このコードを追加します。

    cd "${BUILT_PRODUCTS_DIR}"
    buildVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${INFOPLIST_PATH}" )
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $buildVersion" "${WRAPPER_NAME}/Settings.bundle/Root.plist"
    
  • MyAppName を実際のアプリの名前に置き換え、PreferenceSpecifiers の後の 1 を設定のバージョン エントリのインデックスにします。上記の Root.plist の例では、インデックス 1 にそれが含まれています。

Ben Clayton の plist を使用する https://stackoverflow.com/a/12842530/338986

追加 Run script 後に次のスニペットを付けます Copy Bundle Resources.

version=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$PROJECT_DIR/$INFOPLIST_FILE")
build=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$PROJECT_DIR/$INFOPLIST_FILE")
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $version ($build)" "$CODESIGNING_FOLDER_PATH/Settings.bundle/Root.plist"

追加中 CFBundleVersion それに加えて CFBundleShortVersionString。次のようなバージョンを出力します。

に書くことで$CODESIGNING_FOLDER_PATH/Settings.bundle/Root.plistの代わりに $SRCROOT いくつかの利点があります。

  1. リポジトリの作業コピー内のファイルは変更されません。
  2. パスを大文字と小文字で区別する必要はありません Settings.bundle$SRCROOT. 。パスは異なる場合があります。

Xcode 7.3.1 でのテスト

ここのに基づいて、ここで私は「スクリプトです自動的に設定バンドルのバージョン番号を更新するために用いたM

#! /usr/bin/env python
import os
from AppKit import NSMutableDictionary

settings_file_path = 'Settings.bundle/Root.plist' # the relative path from the project folder to your settings bundle
settings_key = 'version_preference' # the key of your settings version

# these are used for testing only
info_path = '/Users/mrwalker/developer/My_App/Info.plist'
settings_path = '/Users/mrwalker/developer/My_App/Settings.bundle/Root.plist'

# these environment variables are set in the XCode build phase
if 'PRODUCT_SETTINGS_PATH' in os.environ.keys():
    info_path = os.environ.get('PRODUCT_SETTINGS_PATH')

if 'PROJECT_DIR' in os.environ.keys():
    settings_path = os.path.join(os.environ.get('PROJECT_DIR'), settings_file_path)

# reading info.plist file
project_plist = NSMutableDictionary.dictionaryWithContentsOfFile_(info_path)
project_bundle_version = project_plist['CFBundleVersion']

# print 'project_bundle_version: '+project_bundle_version

# reading settings plist
settings_plist = NSMutableDictionary.dictionaryWithContentsOfFile_(settings_path)
  for dictionary in settings_plist['PreferenceSpecifiers']:
    if 'Key' in dictionary and dictionary['Key'] == settings_key:
        dictionary['DefaultValue'] = project_bundle_version

# print repr(settings_plist)
settings_plist.writeToFile_atomically_(settings_path, True)

ここで私はSettings.bundleに持ってRoot.plistです。

<?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>PreferenceSpecifiers</key>
    <array>
        <dict>
            <key>Title</key>
            <string>About</string>
            <key>Type</key>
            <string>PSGroupSpecifier</string>
        </dict>
        <dict>
            <key>DefaultValue</key>
            <string>1.0.0.0</string>
            <key>Key</key>
            <string>version_preference</string>
            <key>Title</key>
            <string>Version</string>
            <key>Type</key>
            <string>PSTitleValueSpecifier</string>
        </dict>
    </array>
    <key>StringsTable</key>
    <string>Root</string>
</dict>
</plist>

他の答えは、次の 1 つの理由により正しく機能しません。スクリプトの実行ビルド フェーズは、設定バンドルがパッケージ化されるまで実行されません。したがって、Info.plist のバージョンが 2.0.11 で、それを 2.0.12 に更新してプロジェクトをビルド/アーカイブした場合、設定バンドルには 2.0.11 と表示されたままになります。設定バンドル Root.plist を開くと、ビルド プロセスが終了するまでバージョン番号が更新されないことがわかります。プロジェクトを再度ビルドして設定バンドルを正しく更新することも、代わりにスクリプトをビルド前のフェーズに追加することもできます。

  • XCode で、プロジェクト ターゲットのスキームを編集します
  • BUILD スキームの開閉矢印をクリックします。
  • 次に、「事前アクション」項目をクリックします。
  • プラス記号をクリックし、「新しいスクリプト実行アクション」を選択します。
  • シェル値を /bin/sh に設定します。
  • 「ビルド設定の提供元」をプロジェクトのターゲットに設定します
  • スクリプトをテキスト領域に追加します。次のスクリプトは私にとってはうまくいきました。プロジェクトの設定に合わせてパスを変更する必要がある場合があります。

    versionString=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}")

    /usr/libexec/PlistBuddy "$SRCROOT/Settings.bundle/Root.plist" -c "PreferenceSpecifiers:0:DefaultValue $versionString を設定します"

これにより、ビルド/アーカイブ プロセス中に設定バンドルがパッケージ化される前にスクリプトが正しく実行されます。設定バンドル Root.plist を開いてプロジェクトをビルド/アーカイブすると、ビルド プロセスの開始時にバージョン番号が更新され、設定バンドルに正しいバージョンが表示されることがわかります。

私はあなたが私は<のhref =「https://stackoverflow.com/questions/372218/insert-subversion-revision-number-in-xcode#414792」で説明したものと似ている方法を使用して、これを行うことができると信じてこのポストに基づいて>この回答する()。

まず、あなたは$ {} VERSIONVALUEに名前を変更することにより、Xcodeの内VersionValue変数を作ることができます。 versionvalue.xcconfigという名前のファイルを作成し、プロジェクトに追加します。アプリケーションのターゲットに移動して、そのターゲットのビルド設定に進みます。私は、ユーザー定義のビルド設定としてVERSIONVALUEを追加する必要があると考えています。そのウィンドウの右下のコーナーでは、値に基づいて変更する「versionvalue」ます。

最後に、あなたのターゲットに移動し、[スクリプトの実行ビルドフェーズを作成します。そのスクリプトの実行フェーズを点検し、スクリプトのテキストフィールド内のスクリプトを貼り付けます。たとえば、次のように現在のSubversionのビルドで私のBUILD_NUMBER設定をタグ付けする私のスクリプトは、次のとおりです。

REV=`/usr/bin/svnversion -nc ${PROJECT_DIR} | /usr/bin/sed -e 's/^[^:]*://;s/[A-Za-z]//'`
echo "BUILD_NUMBER = $REV" > ${PROJECT_DIR}/buildnumber.xcconfig

これは、これらの値は、あなたのプロジェクト内で変更されたときに変数を置き換えるのトリックを行う必要があります。

@Ben Claytonの回答と@Luis Ascorbeと@Vahid Amiriのコメントに基づいた私の実際の例:

注記:このアプローチにより、 設定.bundle/Root.plist リポジトリの作業コピー内のファイル

  1. 設定バンドルをプロジェクト ルートに追加します。名前を変更しないでください
  2. ソースコードとしてSettings.bundle/Root.plistを開きます

    内容を次のように置き換えます。

    <?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>PreferenceSpecifiers</key>
        <array>
            <dict>
                <key>DefaultValue</key>
                <string></string>
                <key>Key</key>
                <string>version_preference</string>
                <key>Title</key>
                <string>Version</string>
                <key>Type</key>
                <string>PSTitleValueSpecifier</string>
            </dict>
        </array>
        <key>StringsTable</key>
        <string>Root</string>
    </dict>
    </plist>
    
  3. 次のスクリプトをプロジェクト (ターゲット) スキームのビルド、プレアクション セクションに追加します。

    version=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$PROJECT_DIR/$INFOPLIST_FILE")
    build=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$PROJECT_DIR/$INFOPLIST_FILE")
    
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:0:DefaultValue $version ($build)" "${SRCROOT}/Settings.bundle/Root.plist"
    
  4. 現在のスキームを構築して実行する

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top