【问题标题】:XCode 4:Insert Subversion revision number in XcodeXCode 4:在 Xcode 中插入 Subversion 修订号
【发布时间】:2011-04-19 13:55:23
【问题描述】:

是的,这与this question 非常相关,但我认为 XCode 3 已经充分回答了这个问题。不确定是否应该合并。

所以 - 使用那里的类似说明,我长期以来一直有很好的效果,将内部版本号编码到存档的 .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

我可以通过查看 ~/Library/.../Foo.app/Info.plist 看到,是的,它确实更新了正确的版本:

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

很明显有一个附加文件需要更新..也许在.xcarchive中?关于首先在哪里钻取的任何建议?

【问题讨论】:

    标签: iphone xcode xcode4


    【解决方案1】:

    我不确定存档角度,但以下内容在 Xcode 4 中对我有用(即我的应用在管理器中列为 Foo 1.0.307)

    1. 手动将info.plist 中的CFBundleShortVersionString(又名“捆绑版本字符串,短”)值设置为major.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. 清理并构建(清理步骤强制 Xcode 重新处理 info.plist)。

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

    【讨论】:

    • 唉,这正是我正在寻找工作的存档,它仍然可以在 XCode 3 中工作,现在似乎在 4 中不起作用。感谢 Jaysen 的建议。谢谢。
    • 嗨,Jaysen,就像一个魅力,但是这个脚本当然会改变你的信息列表,你应该提交,这会导致改变,你应该提交等等。也许最好构建这样的东西作为 svn 或 git commit 钩子? svnbook.red-bean.com/en/1.2/…
    • 根本不起作用,因为路径错误。在下面放一个工作版本。 @JohanPelgrim 是的,可能会更好,但我太懒了
    【解决方案2】:

    如果您的脚本同时更新这两个字段 CFBundle版本 和 CFBundleShortVersionString 然后 .xcarchive 会显示正确的版本

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

    【讨论】:

      【解决方案3】:

      将在管理器中显示,但您的 plist 需要一个 DDBundleBaseVersion 键(我制作的一个键。它应该保存 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 :DDBundleBaseVersion" "${PLIST}"`
      /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $BASEVERNUM.$REV" "${PLIST}"
      /usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $BASEVERNUM.$REV" "${PLIST}"
      

      不会在组织者中显示,但可以正常工作:

      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}"
      

      【讨论】:

      • DDBundleBaseVersion?
      • 刚刚制作了那个键 ;) 我需要一个新键来存储原始的 shortVersion ...也许名称应该不同
      猜你喜欢
      • 2011-08-05
      • 2010-09-11
      • 1970-01-01
      • 1970-01-01
      • 2011-10-29
      • 1970-01-01
      • 2011-07-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多