内部版本号不是由 fastlane 设置的,而是由 Xcode 设置的

Posted

技术标签:

【中文标题】内部版本号不是由 fastlane 设置的,而是由 Xcode 设置的【英文标题】:Build number is not set by fastlane, but is set by Xcode 【发布时间】:2019-06-10 15:37:46 【问题描述】:

我已将我的项目设置为使用运行脚本,该脚本会根据我在主分支中的提交数量自动设置内部版本号:

整个脚本,如果有帮助的话:

#!/bin/bash

#  update_build_number.sh
#  Usage: `update_build_number.sh [branch]`
#  Run this script after the 'Copy Bundle Resources' build phase
#  Ref: http://tgoode.com/2014/06/05/sensible-way-increment-bundle-version-cfbundleversion-xcode/

branch=$1:-'master'
buildNumber=$(expr $(git rev-list $branch --count) - $(git rev-list HEAD..$branch --count))
echo "Updating build number to $buildNumber using branch '$branch'."
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$TARGET_BUILD_DIR/$INFOPLIST_PATH"
if [ -f "$BUILT_PRODUCTS_DIR/$WRAPPER_NAME.dSYM/Contents/Info.plist" ]; then
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$BUILT_PRODUCTS_DIR/$WRAPPER_NAME.dSYM/Contents/Info.plist"
fi

如标题所述,我可以将其构建到设备上,并且构建号已正确设置。或者,我可以通过 Xcode 存档并上传到 AppStore,并且版本再次设置正确。根据这些观察,我假设这是正确配置的。

但是,当我使用 fastlane 来管理我的部署时,它没有更新内部版本号,所以我收到了这个错误:

错误 ITMS-90189:“冗余二进制上传。您已经上传了一个 使用内部版本号“#”构建版本号“#”。确保你 在将应用上传到 App Store 之前增加构建字符串 连接。在 Xcode 帮助中了解更多信息 (http://help.apple.com/xcode/mac/current/#/devba7f53ad4)。”

tl;博士

“你已经给了我们那个版本,给我们一个新的”

对于 fastlane,这是我用来部署 beta 版本的压缩版本:

default_platform(:ios)

platform :ios do
  lane :beta do
    build_app(workspace: "MyApp.xcworkspace", 
              scheme: "MyApp")
    upload_to_testflight
  end
end

最后,如果我在 Xcode 中硬编码一个更新的内部版本号,那么 fastlane 将正确交付文件,所以我假设我的设置是有效的,没有版本问题。

我也尝试了increment_build_number,但我找不到使它工作的设置(另外,Xcode 现在应该为我管理这个,所以不用担心 fastlane)。

【问题讨论】:

你能发布你的 fastlane 日志吗? 【参考方案1】:

想出了这个,结果很简单。

当 Xcode 构建应用程序时,构建输出到:

/Users/theuser/Library/Developer/Xcode/DerivedData/MyAppName/Build/Products/Debug-iphoneos

fastlane构建时,文件保存在本地目录this。

output_directory    
The directory in which the ipa file should be stored in     
Default value: .

通过更改我的build_app 函数的output_directory,我可以将fastlane 指向Xcode 使用的同一文件夹,从而允许脚本工作。

build_app(workspace: "MyApp.xcworkspace", 
          scheme: "MyApp",
          output_directory: "/Users/theuser/Library/Developer/Xcode/DerivedData/MyApp/Build/Products/Debug-iphoneos")

但是,这里有一个不明显的问题。 DerivedData 中的文件夹可以更改,这将成为未来构建的问题。但是,使用这个answer here,您可以改为在 Xcode 中指定一个输出文件夹,然后将其与 fastlane 同步。

【讨论】:

以上是关于内部版本号不是由 fastlane 设置的,而是由 Xcode 设置的的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 如何使用 Fastlane 增加版本号?

更改特定目标 Fastlane 的版本和内部版本号

将内部版本号传递给 Fastlane/Gym 中的 xcargs

Fastlane增加内部版本号会抛出格式错误的64位a.b.c.d.e版本号

Fastlane - 如何通过组将用户添加到 Testflight?

Fastlane - 覆盖输出名称