2011-04-19 86 views
1

是的,这与this question非常相关,但我认为这个问题已经足够回答XCode 3.不知道这是否应该合并。XCode 4:插入Subversion版本号在Xcode

所以 - 从那里使用类似的指令,我很久以来就有将编号编码到归档的.ipa文件中的良好效果,例如Organizer显示的版本类似“1.0.3281”(其中3281是通过下面贴在我的iOS目标构建脚本):

REV=`svnversion -nc | /usr/bin/sed -e 's/^[^:]*://;s/[A-Za-z]//'` 
echo "REV=$REV" 
echo "#define kRevisionNumber @\"$REV\"" > ${PROJECT_DIR}/revision.h 
echo "INFOPLIST_PATH=${INFOPLIST_PATH}" 

BASEVERNUM=`/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" "${INFOPLIST_FILE}" | sed 's/,/, /g'` 
echo "BASEVERNUM=$BASEVERNUM" 
PLISTARG1="Set :CFBundleVersion $BASEVERNUM.$REV" 
echo "PLISTARG1=$PLISTARG1" 

/usr/libexec/PlistBuddy -c "$PLISTARG1" "${TARGET_BUILD_DIR}"/${INFOPLIST_PATH} 

但是,XCode的4(我已经因为来爱)显然需要一些调整,因为这只是魔术作品排序的。这是上面脚本的结果。

REV=3281 
INFOPLIST_PATH=Foo.app/Info.plist 
BASEVERNUM=1.0 
PLISTARG1=Set :CFBundleVersion 1.0.3281 

我可以通过寻找在〜/库/.../ Foo.app/Info.plist,是的,它没有更新的正确版本,请参阅:

<key>CFBundleVersion</key> 
<string>1.0.3281</string> 

因此显然有一个额外的文件需要更新..也许在.xcarchive?关于何处首先钻取的任何建议?

回答

5

我不知道关于存档的角度,但在Xcode 4为我工作(即我的应用程序中的组织者列为富1.0.307)以下

  1. 手动设置CFBundleShortVersionString(在又名“捆绑版本字符串,短”)值的info.plistmajor.minor版本号(如1.0)

  2. 添加“运行脚本”建立阶段将项目与下面的脚本

    REV=`svnversion -nc | /usr/bin/sed -e 's/^[^:]*://;s/[A-Za-z]//'` 
    BASEVERNUM=`/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" "${INFOPLIST_FILE}"` 
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $BASEVERNUM.$REV" "${INFOPLIST_FILE}" 
    
  3. 清理并构建(Clean步骤迫使Xcode重新处理info.plist)。

顺便说一句,你还可以将应用内访问此版本号(例如,您的“关于”页面上)使用[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"]

+0

唉,这正是我正在寻找工作的归档方式,它仍然在XCode 3中工作,现在看起来并不在4中。请欣赏Jaysen的建议。谢谢。 – 2011-06-29 17:07:02

+0

嗨Jaysen,工作就像一个魅力,但这个脚本当然会改变你的信息plist,你应该承诺,这会导致一个变化,你应该承诺,等等等等。也许最好是建立这样的一个svn或者git commit hook? http://svnbook.red-bean.com/en/1.2/svn.reposadmin.create.html#svn.reposadmin.create.hooks – 2011-12-13 11:34:48

+0

根本不工作,因为路径是错误的。把一个工作版本放在下面。 @JohanPelgrim是可能会更好,但我太懒惰 – 2013-09-04 11:39:30

0

如果你的脚本更新这两个领域 CFBundleVersion 和 CFBundleShortVersionString 然后 .xcarchive会告诉你正确的版本

但是可能你找到更好的方法? 赞赏不更新CFBundleShortVersionString的方式。

0

将显示组织者,但你的plist中需要DDBundleBaseVersion关键

PLIST=${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}; 
REV=`svnversion -nc | /usr/bin/sed -e 's/^[^:]*://;s/[A-Za-z]//'` 
BASEVERNUM=`/usr/libexec/PlistBuddy -c "Print :DDBundleBaseVersion" "${PLIST}"` 
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $BASEVERNUM.$REV" "${PLIST}" 
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $BASEVERNUM.$REV" "${PLIST}" 

不会显示在主办方但将正常工作(我编了一个关键应该保持ShortVersionString的原始值。):

PLIST=${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}; 
REV=`svnversion -nc | /usr/bin/sed -e 's/^[^:]*://;s/[A-Za-z]//'` 
BASEVERNUM=`/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" "${PLIST}"` 
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $BASEVERNUM.$REV" "${PLIST}" 
+0

'DDBundleBaseVersion'? – trojanfoe 2013-09-04 11:43:31

+0

只是使这个关键了;)我需要一个新的关键来存储原始的shortVersion ...也许名称应该是不同的 – 2013-09-04 11:48:11