在所有目标中使用相同的CFBundleVersion和CFBundleShortVersionString

时间:2015-05-25 15:41:31

标签: ios xcode version

我在提交应用更新时收到了Apple发来的以下电子邮件:

  

我们发现您最近交付的一个或多个问题   "项目&#34 ;.您的交付成功,但您可以   希望在下次交付时纠正以下问题:

     

CFBundleVersion Mismatch - CFBundleVersion值' 1'延期   ' Project.app/PlugIns/ProjectTodayExtension.appex'才不是   匹配CFBundleVersion值' 985'其中包含iOS   应用' Project.app'。

     

CFBundleShortVersionString不匹配 - CFBundleShortVersionString   价值' 1.0' of extension' Project.app/PlugIns/ProjectTodayExtension.appex'才不是   匹配CFBundleShortVersionString值' 2.1.6'它的含有   iOS应用程序' Project.app'。

     

纠正问题后,您可以使用Xcode或Application   将新二进制文件上载到iTunes Connect的加载程序。

是否有任何方法可以在所有目标中使用相同的 CFBundleVersion CFBundleShortVersionString 来防止这种情况发生?

7 个答案:

答案 0 :(得分:12)

我的解决方案是:

对于 CFBundleShortVersionString

  • 项目设置
  • 中添加用户定义的常量

Add a user-defined constant in your **project** settings

  • 将其命名为 $(CF_BUNDLE_SHORT_VERSION_STRING)并将其设置为所需的值

enter image description here

  • 将目标中的版本设置为 $(CF_BUNDLE_SHORT_VERSION_STRING)

enter image description here

  • 重复所有目标。的完成 <!/ LI>

CFBundleVersion :您可以对 CFBundleVersion 执行相同的操作,但不知何故,我希望根据我的GIT repo提交计算来计算此值。我这样做了:

  • 主要目标添加预执行。您可以通过产品&gt;访问显示的对话框方案&gt;编辑方案

enter image description here

  • 将后期操作添加到主要目标

enter image description here

  • 添加名为 BundleVersionUpdate 的新命令行工具目标和名为 BundleVersionRevert
  • 的目标

enter image description here

  • 导航到新的 BundleVersionUpdate 目标并添加新的运行脚本构建阶段

enter image description here

  • 粘贴以下内容
\#!/bin/sh

INFOPLIST="${SRCROOT}/MyApp/MyApp-Info.plist"
INFOPLIST_WKAPP="${SRCROOT}/MyApp-WKApp/Info.plist"
INFOPLIST_WKEXT="${SRCROOT}/MyApp-WKExt/Info.plist"

PLISTCMD="Set :CFBundleVersion $(git rev-list --all|wc -l)"

echo -n "$INFOPLIST" 
| xargs -0 /usr/libexec/PlistBuddy -c "$PLISTCMD"

echo -n "$INFOPLIST_WKAPP" 
| xargs -0 /usr/libexec/PlistBuddy -c "$PLISTCMD"

echo -n "$INFOPLIST_WKEXT" 
| xargs -0 /usr/libexec/PlistBuddy -c "$PLISTCMD"
  • 导航到新的 BundleVersionRevert 目标并添加新的运行脚本构建阶段并粘贴:
\#!/bin/sh

INFOPLIST="${SRCROOT}/MyApp/MyApp-Info.plist"
INFOPLIST_WKAPP="${SRCROOT}/MyApp-WKApp/Info.plist"
INFOPLIST_WKEXT="${SRCROOT}/MyApp-WKExt/Info.plist"

PLISTCMD="Set :CFBundleVersion SCRIPTED"

echo -n "$INFOPLIST" 
| xargs -0 /usr/libexec/PlistBuddy -c "$PLISTCMD"

echo -n "$INFOPLIST_WKAPP" 
| xargs -0 /usr/libexec/PlistBuddy -c "$PLISTCMD"

echo -n "$INFOPLIST_WKEXT" 
| xargs -0 /usr/libexec/PlistBuddy -c "$PLISTCMD"
  • 享受!

答案 1 :(得分:12)

计划操作不在源代码管理中,因此最好将构建阶段添加到应用程序的目标中。可以使用一个简单的脚本来解决所有目标中的版本同步,该脚本可以针对您想要同步的每个目标进行修改:

  1. 添加&#34; 新运行脚本阶段&#34;在&#34; 构建阶段&#34;为你的应用程序的目标
  2. enter image description here

    1. 将脚本重命名为&#34; Sync Versions&#34;并将其拖到上方&#34; 编译来源&#34; (注意:Xcode有一个错误,可能会阻止拖放工作。如果是这样,你需要手动编辑.pbxproj文件,以便构建阶段进入正确的位置

    2. 将以下脚本粘贴到shell中:

      INFOPLIST_MYAPP="${SRCROOT}/MyApp/MyApp-Info.plist"
      myAppVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$INFOPLIST_MYAPP")
      myAppBuild=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_MYAPP")
      
      INFOPLIST_SHAREEXT="${SRCROOT}/ShareExtension/Info.plist"
      /usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $myAppVersion" "$INFOPLIST_SHAREEXT"
      /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $myAppBuild" "$INFOPLIST_SHAREEXT"
      
    3. enter image description here

      1. 按照正常方式构建项目,以及您的共享扩展程序版本&amp;构建将与您的主要目标保持同步。

答案 2 :(得分:3)

ProjectTodayExtension.appex的版本必须与您的应用相同。例如:

目标&GT;一般:

版本:1.0&lt; - 在此更改 Biuld:1.0

如果你的应用程序版本上的itunes connect是2.3,那么你必须将TodayExtension的版本更改为相同的版本2.3。

答案 3 :(得分:2)

Twitch共享了一个非常甜蜜的版本管理系统。

在此blog post中描述,它有点类似于stk已接受的answer但更清晰,并且还支持以下内容:

  • 在构建之前将构建号直接(并且可逆地)绑定到git commit。轻松返回构建用于崩溃报告的确切版本。

  • 通过目标依赖关系处理版本生成,这种关联更容易在多个目标之间共享。

  • 在Xcode构建设置中内置的Info.plist功能上使用C预处理器,允许动态替换版本号,而无需修改Info.plist文件。

实施起来有点复杂,但它是我找到的最佳解决方案,特别是如果你有扩展或其他目标,其版本必须保持同步。

安装说明: 请注意,博客在描述四个shell文件方面做得很好,但并未真正提供安装或自定义说明。这是我做的:

  1. 在项目的顶层创建一个Versions子目录(.xcodeproj所在的位置)。

  2. 下载代码示例左下角的gist链接指示的四个文件。将四个文件移动到您的Versions目录中。

  3. 使用terminal,cd到您的Versions目录,然后执行cmd:chmod +x *以使shell文件可执行

  4. 现在请从开始按照博客中的说明创建您的依赖关系目标。

  5. 您可能应该稍微自定义脚本。我更改了命名并重构了将4个工具移动到我在项目中共享的单独工具目录。 YMMV。

答案 4 :(得分:1)

Xcode 11 +

1)转到项目设置,选择PROJECT(在目标上方),转到Build Settings
2)按Add User-Defined Setting并添加APP_BUILDAPP_VERSION
3)在您需要同步的所有目标和扩展中,转到目标Info,将Bundle version替换为$(APP_BUILD),将Bundle version string替换为$(APP_VERSION)
4)哇!您只应在PROJECT的Build Settings中的一个位置更改捆绑软件版本。

答案 5 :(得分:1)

Xcode 12

我能够通过以下方式保持目标扩展版本并构建与主应用程序同步的字符串:

  1. Run Script Phase上方添加Compile Sources
  2. 将以下内容添加到新创建的运行脚本的内容中:
WIDGET_EXTENSION="${SRCROOT}/MyWidget/Info.plist"
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString ${MARKETING_VERSION}" "$WIDGET_EXTENSION"
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion ${CURRENT_PROJECT_VERSION}" "$WIDGET_EXTENSION"

答案 6 :(得分:0)

尝试验证我的存档时,我收到错误信息CFBundleShortVersionString缺失。 为了解决这个问题,我在xml代码中进入Info.plist并添加了CFBundleShortVersionString  新版本号 这个以plist格式生成的Bundle版本字符串,简称 这解决了我的问题