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

jhe*_*ran 12 xcode version ios

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

我们发现您最近为"项目"投放的一个或多个问题.您的投放成功,但您可能希望在下次投放时更正以下问题:

CFBundleVersion不匹配 - 扩展"Project.app/PlugIns/ProjectTodayExtension.appex"的CFBundleVersion值"1"与其包含的iOS应用程序"Project.app"的CFBundleVersion值"985"不匹配.

CFBundleShortVersionString不匹配 - 扩展名"Project.app/PlugIns/ProjectTodayExtension.appex"的CFBundleShortVersionString值"1.0"与其包含的iOS应用程序"Project.app"的CFBundleShortVersionString值"2.1.6"不匹配.

纠正问题后,您可以使用Xcode或Application Loader将新二进制文件上传到iTunes Connect.

有没有办法在所有目标中使用相同的CFBundleVersionCFBundleShortVersionString来防止这种情况?

stk*_*stk 16

我的解决方案是:

对于CFBundleShortVersionString:

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

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

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

在此输入图像描述

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

在此输入图像描述

  • 重复所有目标.做完了!

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

  • 将预执行添加到主目标.您可以通过产品>方案>编辑方案访问显示的对话框

在此输入图像描述

  • 主目标添加后期操作.

在此输入图像描述

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

在此输入图像描述

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

在此输入图像描述

  • 粘贴以下内容
\#!/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"
Run Code Online (Sandbox Code Playgroud)
  • 导航到新的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"
Run Code Online (Sandbox Code Playgroud)
  • 请享用!


Ore*_*ren 13

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

  1. 在" 构建阶段 "中为应用程序的目标添加" 新运行脚本阶段 "

在此输入图像描述

  1. 将脚本重命名为"Sync Versions"并将其拖到" Compile Sources " 上方(注意: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"
    
    Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  1. 像往常一样构建项目,共享扩展的版本和构建将与主目标保持同步.