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


91

アプリケーションの設定バンドルに、アプリケーションのバージョンと内部リビジョン(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ファイルを処理(前処理)し、ソースファイルに影響を与えずにリビジョン番号を置き換える方法です。

回答:


69

前の回答のいずれよりもはるかに簡単な別の解決策があります。Appleは、ほとんどのインストーラーにPlistBuddyというコマンドラインツールをバンドルしており、Leopardのに含まれてい/usr/libexec/PlistBuddyます。

を置き換えたいのでVersionValue、バージョン値がに抽出されていると仮定すると、$newVersion次のコマンドを使用できます。

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

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

注: plistへのパスのみを指定すると、PlistBuddyはインタラクティブモードになるため、変更を保存する前に複数のコマンドを発行できます。ビルドスクリプトに追加する前に、これを行うことを強くお勧めします。


20
私のplistのバージョン番号を参照する正しい方法を理解するのにしばらく時間がかかります。私の場合、それは/ usr / libexec / PlistBuddy Settings.bundle / Root.plist -c "set PreferenceSpecifiers:0:DefaultValue $ newversion"であることが判明しました-うまくいけば、それは他の人々に役立つでしょう。
JosephH 2010年

Quinn Taylor、JosephH、あなたの回答のおかげで、Settings.bundleにアプリのバージョン番号を自動的に実装することができました。両方とも+1 ;-)
ニコ

7
カスタムの「スクリプトの実行」ビルドフェーズから、Root.plistへのパスをさらに含める必要がありました:/ usr / libexec / PlistBuddy $ {TARGET_BUILD_DIR} / $ {FULL_PRODUCT_NAME} /Settings.bundle/Root.plist -c "set PreferenceSpecifiers:0:DefaultValue $ newVersion "
Chris Vasselli 2013

2
完全を期すために、PListBuddyを使用した別のアプローチを次に示します。xcodehelp.blogspot.com
koen

最も正しい方法は/usr/libexec/PlistBuddy -c "Set :PreferenceSpecifiers:0:DefaultValue ${newVersion}" "${TARGET_BUILD_DIR}/${CONTENTS_FOLDER_PATH}/Settings.bundle/Root.plist"
kambala 2015年

66

私の怠惰な男の解決策は、私のアプリケーションコードからバージョン番号を更新することでした。Root.plistにデフォルト(または空白)の値を設定してから、スタートアップコードのどこかに設定することができます。

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

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

アイデアをさらに進めて、たとえば、アプリが起動された回数のカウンターやその他の興味深い情報を更新することができます。


9
これは、ユーザーがアプリを起動するに[設定]移動した場合を除いて機能します。
モシェ

9
@Moshe Trueですが、これをエレガントに処理するには、.plistファイル内でデフォルト値を指定するだけです。おそらく「まだ起動されていません」のようになります
Carlos P

1
ほとんどの開発者はおそらく同じ値に設定CFBundleShortVersionStringCFBundleVersionますが、CFBundleShortVersionString実際にはAppleがリリースしたバージョンを検討してほしいと望んでいます。これは、ユーザーに表示するものです。 CFBundleVersion内部バージョン番号である可能性があり、おそらくユーザーに表示すべきではありません(異なる場合)。
ネイト2012年

3
私は何かが足りないのですか?これはまさに私がしていることですが、値は変更されません。読み取り専用だと思うTitleプロパティを使用していませんか?
samson 2012年

2
アプリケーションを更新するときにも別の問題があります。設定バンドルには、更新されたアプリケーションが少なくとも1回起動されるまで、古いビルドバージョンが表示されます。
レゴレス2013

61

@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にあります。


これが最善の方法だと思います
Tony

これを試してみましたが、設定バンドルでTitle値が変更されています。タイトルはInAppSettingsKitに表示されますが、値は初期バージョンから変更されません。タイトルが設定アプリに表示されることはありません。私はあきらめて、ユーザーがメニューで「
バージョン情報

この方法を使用する場合、設定は読み取り専用ではありません。つまり、settings.appのバージョン番号設定を利用して、編集することができます。
モーションポーション2014

8
私は彼の答えに基づいて、それをリメイクので、bashスクリプトは、@ベン・クレイトンプットは、私のために動作しませんでした、ここにある:buildVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "${PROJECT_DIR}/${INFOPLIST_FILE}") /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:3:DefaultValue $buildVersion" "${SRCROOT}/Settings.bundle/Root.plist"
ルイスAscorbe

1
${INFOPLIST_PATH}info plist pathに使用できます
Tomer Even 2016

23

ベンクレイトンの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。パスは異なる場合があります。

Xcode7.3.1でのテスト


1
これは、プロジェクトスキームのビルド、プレアクションセクションにスクリプトを追加する場合のベストアンサーIMOです。アンディの答えを見てください。
ヴァヒド・アミリ

2
これは私のために働いています。「DefaultValue」を自分に固有のものに変更することを忘れないでください。たとえば、フッターを変更したかったので、「FooterText」を使用しました。また、「PreferenceSpecifiers」の後の番号を変更して、plistの項目に関連付ける必要があります。
リチャードウィザースプーン

12

例に基づいて、ここで、ここで私は、自動的にバージョン番号バンドル設定を更新するために使用しているスクリプトは次のとおりです。

#! /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>

非常に便利です-PythonからPlistBuddyを実行するのに問題があり、使用することを考えたことはありNSDictionaryませんでした(また、plistファイルに簡単にアクセスできることに気づいていませんでした)
Dov

これありがとう。1つの変更(現在のように、builddirではなくソースに変更が加えられます)は、デバイスまたはシミュレーターに表示されるものが、実際のビルドバージョンよりも常に1ビルドバージョン遅れることを意味します。これを修正するために、最初にソースを繰り返し、次にbuilddirも繰り返すようにスクリプトを変更しました。settings_path_build = os.path.join(os.environ.get( 'TARGET_BUILD_DIR')、settings_file_path_build)
xaphod 2014年

...そしてまた、私はギタッシュを追加します:gitHash = subprocess.check_output(["git", "rev-parse", "--short", "HEAD"]).rstrip()
xaphod 2014年

8

他の回答は、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 "set PreferenceSpecifiers:0:DefaultValue $ versionString"

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


ありがとうございます。正しいビルドバージョンが表示されるのはソリューションのみです。2回ビルドする必要がある他のソリューション。
Boris Y.

これには、Xcode 10.0を使用した2番目のビルドが必要でした
Patrick

@PatrickiOS設定アプリは古い情報を保持することがあります。変更を確認するには、設定アプリを強制終了して再起動する必要があります。
アンディ

1
ところで、このスクリプトを追加する簡単な方法を見つけました。プロジェクトターゲットの[ビルドフェーズ]タブに移動し、[+]アイコンをクリックします。「新規実行スクリプトフェーズ」を選択し、そこにスクリプトコードを追加します。これが重要です。新しい実行スクリプトをクリックして、[ビルドフェーズ]リストの一番上、[ターゲットの依存関係]の下、[ソースのコンパイル]の前にドラッグします。これはビルド前のスクリプトと同じように動作し、見つけやすくなります。
アンディ

@Andyに感謝します。[ビルドフェーズ]タブに追加するソリューションは、完全に機能しました。
パトリック

7

Xcode 11.4では、次の手順を使用して、アプリケーションの設定バンドルにアプリのバージョンを表示できます。


セット$(MARKETING_VERSION)$(CURRENT_PROJECT_VERSION)変数

注:場合$(MARKETING_VERSION)$(CURRENT_PROJECT_VERSION)変数がために現れるBundle version string (short)Bundle versionのキー のInfo.plistには、次の手順をスキップして次のセクションにジャンプすることができます。

  1. Xcodeプロジェクトを開きます。
  2. プロジェクトナビゲーターcmd1)を開き、プロジェクトを選択してプロジェクトの設定を表示してから、アプリのターゲットを選択します。
  3. [全般]タブを選択します。
  4. [ ID]セクションで、[バージョン]フィールドの内容を新しい値(例0.1.0)に変更し、[ビルド]フィールドの内容を新しい値(例12)に変更します。これらの2つの変更が作成されます$(MARKETING_VERSION)し、$(CURRENT_PROJECT_VERSION)中に変数のInfo.plistファイル。

設定バンドルを作成して構成する

  1. プロジェクトナビゲータでを選択します。
  2. [ファイル] > [新規] > [ファイル...]を選択しますcmdN)。
  3. iOSを選択しますタブをます。
  4. [リソース]セクションで[設定バンドル]を選択し、[次へ]をクリックして[作成]をクリックします
  5. 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>

実行スクリプトを追加する

  1. プロジェクトナビゲータでを選択します。
  2. アプリのターゲットを選択します。
  3. ビルドフェーズを選択します]タブをます。
  4. + >新しいスクリプト実行フェーズをクリックします
  5. バンドルリソースのコピーの上に新しいフェーズをドラッグアンドドロップしますセクションのます。このように、スクリプトはアプリケーションをコンパイルする前に実行されます。
  6. 新しく追加されたスクリプトの実行フェーズを開き、次のスクリプトを追加します。
version="$MARKETING_VERSION"
build="$CURRENT_PROJECT_VERSION"
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:0:DefaultValue $version ($build)" "${SRCROOT}/Settings.bundle/Root.plist"

アプリを起動

  1. 製品を実行します(cmdRデバイスまたはシミュレーターで)を。
  2. デバイスまたはシミュレーターで、アプリが起動したら、設定アプリを開き、サードパーティアプリのリストからアプリを選択します。アプリのバージョンは次のように表示されます。


ソース


これは私にエラーを投げますSet: Entry, "PreferenceSpecifiers:0:DefaultValue", Does Not Exist
ジョーダンH

2
これは私のために働いた:/usr/libexec/PlistBuddy "$SRCROOT/AppName/Settings.bundle/Root.plist" -c "set PreferenceSpecifiers:0:DefaultValue $version"
ジョーダンH

ありがとう。これは私にとってどのような世界です。しかし、私の名前はSettings-Watch.bundleで、削除されました($build)
Kurt Lane

3

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
    

そしてそれはそれでした!


これは、plistファイルの1つの値を置き換えるだけでも大変な作業のように思えます... plistをビルドするときに変数にアクセスできるのは概念的にはクールですが、plistファイルのツールビルドを使用する方がはるかに簡単です。私は私の答えの中でPlistBuddyについて説明します—それを試してみてください!
クインテイラー

3

@BenClaytonの回答と@LuisAscorbeおよび@VahidAmiriのコメントに基づく私の作業例:

注:このアプローチは、リポジトリの作業コピー内のSettings.bundle /Root.plistファイルを変更します

  1. 設定バンドルをプロジェクトルートに追加します。名前を変更しないでください

  2. Settings.bundle /Root.plistをSourceCodeとして開きます

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

    <?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. 現在のスキームを構築して実行する


2

上記の回答は私にはうまくいかなかったので、カスタムスクリプトを作成しました。

これにより、Root.plistからエントリが動的に更新されます。

以下の実行スクリプトを使用してください。xcode10.3で確実に検証されて動作します。

「varbuildVersion」は、タイトルに表示されるバージョンです。

また、settings.bundleRoot.plistのタイトルの識別子名は以下の「varversion」です。

cd "${BUILT_PRODUCTS_DIR}"

#set version name to your title identifier's string from settings.bundle
var version = "Version"

#this will be the text displayed in title
longVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${INFOPLIST_PATH}")
shortVersion=$(/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" ${TARGET_BUILD_DIR}/${INFOPLIST_PATH})
buildVersion="$shortVersion.$longVersion"

path="${WRAPPER_NAME}/Settings.bundle/Root.plist"

settingsCnt=`/usr/libexec/PlistBuddy -c "Print PreferenceSpecifiers:" ${path} | grep "Dict"|wc -l`

for (( idx=0; idx<$settingsCnt; idx++ ))
do
#echo "Welcome $idx times"
val=`/usr/libexec/PlistBuddy -c "Print PreferenceSpecifiers:${idx}:Key" ${path}`
#echo $val

#if ( "$val" == "Version" )
if [ $val == "Version" ]
then
#echo "the index of the entry whose 'Key' is 'version' is $idx."

# now set it
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:${idx}:DefaultValue $buildVersion" $path

# just to be sure that it worked
ver=`/usr/libexec/PlistBuddy -c "Print PreferenceSpecifiers:${idx}:DefaultValue" $path`
#echo 'PreferenceSpecifiers:$idx:DefaultValue set to: ' $ver

fi

done

Root.plistのエントリ例

    <dict>
        <key>Type</key>
        <string>PSTitleValueSpecifier</string>
        <key>Title</key>
        <string>Version</string>
        <key>DefaultValue</key>
        <string>We Rock</string>
        <key>Key</key>
        <string>Version</string>
    </dict>

作業サンプルRoot.plistエントリ


1

私がこの回答で説明しているのと同様の方法を使用してこれを行うことができると思いますこの投稿に基づいています)。

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

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

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

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


これは、バージョン番号をInfo.plistファイルに埋め込みたい場合に機能します。しかし、他のplistファイル、たとえばSettings.bundleにあるRoot.plistファイルでは機能しません。これを有効にするために使用できるビルド設定はありますか?
Panagiotis Korros 2009年

0

私にとって、これは最も簡単な解決策でした。

バンドルリソースのコピーステップの前に、新しいスクリプトビルドフェーズを追加します

シェル: /usr/bin/env python

コンテンツ:

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

# Key to replace
settings_key = 'version_preference' # the key of your settings version

# File path
settings_path = os.environ.get('SRCROOT') + "/TheBeautifulNameOfYourOwnApp/Settings.bundle/Root.plist"

# Composing version string
version_string = os.environ.get('MARKETING_VERSION') + " (" + os.environ.get('CURRENT_PROJECT_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'] = version_string

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