1)「Aggregate」タイプのプロジェクトに新しいターゲットを追加します。たとえば、「UpdateInfo.plistPrefixHeader」という名前を付けることができます。ダイアログの「製品名」として使用してください。
2)次のソースコードを使用して、この新しいターゲットにスクリプト実行ビルドフェーズを追加します。
#!/bin/sh
SVN_REVISION=$(git svn find-rev HEAD)
echo "#define SVN_REVISION $SVN_REVISION" > "$SCRIPT_OUTPUT_FILE_0"
3)スクリプトに出力ファイルを追加し、名前を付けます
$(CONFIGURATION_TEMP_DIR)/InfoPlist.pch
4)iOSアプリのビルドフェーズを開きます。
5)以前に作成した集約ターゲットを依存ターゲットとして追加します(「ターゲット依存関係」に追加します)。これは、XcodeがiOSターゲットをビルドする前に、常に最初にこのターゲットをビルドすることを意味します。
6)iOSアプリのビルド設定を開きます。
7)「Info.plistプリプロセッサプレフィックスファイル」の設定を検索し、手順(3)で出力ファイルに使用したのとまったく同じ値に変更します。
8)「前処理Info.plistファイル」の設定を検索し、有効になっていることを確認します。
9)現在のInfo.plistファイルを開き、CFBundleVersionの値をに変更しますSVN_REVISION
。$(SVN_REVISION)または${SVN_REVISION}は使用しないでください。これはビルド設定や環境変数の置き換えではなく、プリプロセッサの置き換えであるため、SVN_REVISIONを使用するだけです。
それでおしまい。iOSアプリをビルドするたびに、Xcodeは最初に集約ターゲットをビルドしてPCHファイルを更新し、iOSアプリをビルドするときに、Info.plistファイルをCプリプロセッサーを介して実行します(PCHファイルをプレフィックスとして使用)ヘッダー)アプリケーションにコピーする前に。プリプロセッサは、PCHファイルでマクロとして定義されているため、SVN_REVISIONに置き換わります。
重要な注意事項
$(DERIVED_FILE_DIR)
の代わりに使用する方が良いと考える人もいるかもしれません$(CONFIGURATION_TEMP_DIR)
。まあ、理論的には正しいですが、実際には1つの問題があります。派生ファイルのディレクトリはターゲットごとに異なりますが、構成の一時ディレクトリは同じです(ビルド構成ごとにのみ異なります)。派生ファイルディレクトリを使用する場合、PCHファイルは集約ターゲットの派生ファイルディレクトリに書き込まれますが、iOSアプリをビルドする場合、XcodeはiOSアプリの派生ファイルディレクトリでこのファイルを検索するため、検出されません。ファイル。
一部の人々は、iOSアプリの最初のビルドフェーズとして、プレフィックスヘッダーを更新するスクリプトの実行フェーズを追加する方がよいと考えるかもしれません(これにより、前述の派生ファイルディレクトリの問題も解決されます)その上)。繰り返しになりますが、理論的には素晴らしいアイデアですが、実際には機能しません。前処理が要求された場合、Info.plistは最初のスクリプトフェーズが実行される前に前処理されるため、PCHファイルがまだ存在しないか、まだ更新されていない場合は、ビルドがエラーで終了するか、古いSVNリビジョンがplistファイルに書き込まれます。そのため、このタスクには、実際のターゲットよりも前にビルドされることが保証されている別のターゲットが必要です。