2011-08-02 15 views
18

我努力做到以下幾點:的iOS:在構建階段改變的info.plist

  1. 在構建階段,打開一個純文本文件和文字
  2. 更改屬性的值info.plist到步驟1中獲得的值。

我可以爲此編寫一個shell腳本嗎?

這將是巨大的,如果有人能指導我實現這一目標。

回答

13

是的,你可以。我會做的三個步驟:

  1. 編寫的第一內建階段之前運行shell腳本。讓這個腳本設置一個環境變量。
  2. 啓用「展開構建設置中的Info.plist」爲你的項目。
  3. 在plist文件中使用環境變量,如​​。
+1

謝謝!但是在這個階段我怎麼能打開一個文件並從中讀取文本呢? – Mithin

+0

@Mithin - 完全取決於您編寫shell腳本的語言。 – PeyloW

+1

如果鍵是布爾值,該怎麼辦?它不會接受環境變量名稱佔位符。 –

7

@PeyloW提供了做這件事。另一種方法是添加一個運行腳本構建步驟。在那一步你可以重寫你的Info.plist。我一直這樣做來設置svnversion。

我建議把文件中的腳本,然後把. myscript.sh在運行腳本階段。這比將整個腳本直接放在Xcode中更容易理解和維護。

+2

+1將腳本放在單獨的文件中。 我也曾經重寫過plist文件。但是這樣做往往會對源代碼管理中的plist文件進行不必要的修改。所以我改變了env變量解決方案。 – PeyloW

+0

env變量解決方案非常好,如果我構建另一個版本控制腳本,我可能會轉而採用這種方法以簡化操作。該腳本更加靈活。 –

2

我有把一個內部版本號爲場中我info.plist中的腳本文件。我在項目中的info.plist中放置了一些佔位符文本,然後腳本將其替換。它只會在發佈版本上增加內部版本號。在開發版本上,它只是說它們是一個開發版本。

if [ "$BUILD_STYLE" = "Release" ] 
    then 
    if [ ! -f build-number ]; then 
     echo 0 > build-number 
    else 
     expr `cat build-number` + 1 > build-number.new 
     mv build-number.new build-number 
    fi 

    perl -pi -e s/BUILD_NUMBER_PLACEHOLDER/`cat build-number`/ $BUILT_PRODUCTS_DIR/$PRODUCT_NAME.app/Contents/Info.plist 
    else 
    perl -pi -e s/BUILD_NUMBER_PLACEHOLDER/`echo Development`/ $BUILT_PRODUCTS_DIR/$PRODUCT_NAME.app/Contents/Info.plist 
    fi 
16

也許最簡單的方法是使用PlistBuddy。我有一個運行腳本階段,看起來像這樣:

BUILD_NUMBER=`git rev-list HEAD --count` 
INFO_PLIST="$BUILT_PRODUCTS_DIR/$INFOPLIST_PATH" 
if [ -f "$BUILT_PRODUCTS_DIR/$INFOPLIST_PATH" ] ; then 
    oldversion=`/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" "$INFO_PLIST"` 
fi 
if [ "$BUILD_NUMBER" != "$oldversion" ] ; then 
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $BUILD_NUMBER" "$INFO_PLIST" 
fi 

(需要注意的是啓動和Xcode 6,你必須運行此的複製包資源階段之後,因爲Info.plist不會被複制到目標位置直到那時和PlistBuddy會失敗)

編輯01/17:已更新,以避免不必要的複製或目標籤名。除非有真正改變,否則你不想觸碰Info.plist,否則Xcode會將其視爲已修改的對象(並因此將其視爲目標)。檢查以前的值CFBundleVersion可以顯着加快構建 - 它節省了我幾秒鐘的noop構建。

+0

我花了很長時間才弄清楚爲什麼我的腳本爲常規構建工作,但在構建存檔時失敗。它必須在複製捆綁軟件資源之後運行。謝謝! –

相關問題