93

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

4

13 に答える 13

71

前の回答のいずれよりもはるかに簡単な別の解決策があります。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はインタラクティブモードになるため、変更を保存する前に複数のコマンドを発行できます。ビルドスクリプトに追加する前に、これを行うことを強くお勧めします。

于 2009-06-30T05:22:16.593 に答える
66

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

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

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

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

于 2009-07-17T17:46:40.370 に答える
65

@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>
  • Run Scriptビルド フェーズを作成し、 Copy Bundle Resourcesフェーズの後に移動します。次のコードを追加します。

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

于 2012-10-11T14:55:59.413 に答える
13

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

#! /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>
于 2010-07-05T12:20:41.697 に答える
9

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

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

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

    /usr/libexec/PlistBuddy "$SRCROOT/Settings.bundle/Root.plist" -c "set PreferenceSpecifiers:0:DefaultValue $versionString"

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

于 2016-05-09T04:07:52.570 に答える
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 here で説明されているように、リポジトリのリビジョンを .h ファイルに抽出するカスタム実行スクリプト ビルド フェーズがありました。

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

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

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

それだけでした!

于 2009-05-19T14:52:54.970 に答える
1

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

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

最後に、ターゲットに移動し、Run Script ビルド フェーズを作成します。その実行スクリプト フェーズを調べて、スクリプト テキスト フィールド内にスクリプトを貼り付けます。たとえば、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

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

于 2009-05-18T12:54:23.677 に答える