我在提交应用更新时收到了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 来防止这种情况发生?
答案 0 :(得分:12)
我的解决方案是:
对于 CFBundleShortVersionString :
CFBundleVersion :您可以对 CFBundleVersion 执行相同的操作,但不知何故,我希望根据我的GIT repo提交计算来计算此值。我这样做了:
\#!/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"
\#!/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)
计划操作不在源代码管理中,因此最好将构建阶段添加到应用程序的目标中。可以使用一个简单的脚本来解决所有目标中的版本同步,该脚本可以针对您想要同步的每个目标进行修改:
将脚本重命名为" Sync Versions"并将其拖到上方" 编译来源" (注意:Xcode有一个错误,可能会阻止拖放工作。如果是这样,你需要手动编辑.pbxproj文件,以便构建阶段进入正确的位置
将以下脚本粘贴到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"
答案 2 :(得分:3)
ProjectTodayExtension.appex的版本必须与您的应用相同。例如:
目标>一般:
版本:1.0< - 在此更改 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文件方面做得很好,但并未真正提供安装或自定义说明。这是我做的:
在项目的顶层创建一个Versions子目录(.xcodeproj所在的位置)。
下载代码示例左下角的gist链接指示的四个文件。将四个文件移动到您的Versions目录中。
使用terminal,cd到您的Versions目录,然后执行cmd:chmod +x *
以使shell文件可执行
现在请从开始按照博客中的说明创建您的依赖关系目标。
您可能应该稍微自定义脚本。我更改了命名并重构了将4个工具移动到我在项目中共享的单独工具目录。 YMMV。
答案 4 :(得分:1)
1)转到项目设置,选择PROJECT(在目标上方),转到Build Settings
2)按Add User-Defined Setting
并添加APP_BUILD
和APP_VERSION
3)在您需要同步的所有目标和扩展中,转到目标Info
,将Bundle version
替换为$(APP_BUILD)
,将Bundle version string
替换为$(APP_VERSION)
。
4)哇!您只应在PROJECT的Build Settings
中的一个位置更改捆绑软件版本。
答案 5 :(得分:1)
我能够通过以下方式保持目标扩展版本并构建与主应用程序同步的字符串:
Run Script Phase
上方添加Compile Sources
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版本字符串,简称 这解决了我的问题