Xcode 4.5中的存档 - 没有错误,但构建被取消

12

我已经开发iOS应用超过2年,从未遇到这个问题。我正在尝试对一个应用进行归档以进行测试版分发。构建成功,但在整个过程的最后,Xcode报告“已取消归档”。

输 明图像描述

构建日志没有显示任何警告或错误。

输入图片说明

有时,通过清理/清理生成文件夹/清除派生数据,我可以使归档成功,但似乎没有模式可循。有人遇到过这个问题吗?在这种情况下,我甚至没有任何错误消息可依据。


1
从未见过或听说过。通过清理项目等方式,您正在做正确的事情。尝试重新安装您的Xcode,可能存在与Xcode有关的问题。我知道这样做很痛苦,但它可能会一劳永逸地解决问题。但这是最后的手段。 - Adrian P
你最终解决了这个问题吗?我也遇到了完全相同的问题。你的项目使用cocoapods吗?我在想这是否是我的问题所在。没有其他线索可以说明出错的原因 :( - ConfusedNoob
我曾经考虑重新安装Xcode。我想我得尝试一下。我确实使用CocoaPods,但是过去我在多个项目中使用CocoaPods时没有任何问题。 - Mark Struzinski
8个回答

56

您是否有一个使用agvtool升级版本的自定义运行脚本?我发现这会导致精确的这种行为。几乎100%的失败率,以及常见的构建失败。将其移除对我来说解决了这个问题。


5
哇,就是这样。我正在使用AVGTool的自定义运行脚本来提高版本号。太棒了!致命的问题在于日志中没有任何反馈告诉你哪些因素取消了构建。感谢您的答案! - Mark Struzinski
1
这个问题让我花了好几个小时。在自动化构建、生成ipa包和其他高级操作后,avgtool一度让脚本崩溃。谢谢! - benjamin.ludwig
3
我认为发生的情况是依赖系统检测到源文件(在这种情况下是您的plist文件)发生了变化,从而中止了构建。 - Buddhisthead
@Buddhisthead,如果我需要构建号仅在成功构建后增加,您有什么建议?当我将其添加到“编辑方案”作为后置操作时,脚本无法正常工作。 - Ahmed Shendy
1
@AhmedShendy 请看下面我的回答 - 我终于让存档帖子的操作起作用了。 - Trev14

34

首先,对ConfusedNoob的回答点个赞+1,因为那就是问题所在(这让我做了很多实验,最终得到这个解决方案)。如果我的回答有帮助,请也给他点个赞+1,因为他的提示非常重要!

(另外,看看我的其他答案,在下面,完全绕过了agvtool。最终我在所有项目中都采用了这种方法。)

我已经尝试了一些方法,唯一可靠的解决方法是在适当的方案中使用agvtool作为预动作,而不是在构建阶段中运行脚本。

  • 按CMD-SHIFT-comma编辑方案(XCode 6.x)
  • 打开想要进行此操作的任何方案。我在RunArchive上这样做,但我可能只需要在archive上这样做。
  • 选择“+”图标和“新的运行脚本”
  • 添加你的agvtool脚本。如果你关心的话,我的是:

  • cd ${PROJECT_DIR} ; xcrun agvtool next-version -all
    

(注意: 预设操作不会自然地在 ${PROJECT_DIR} 中运行,所以您需要 cd 命令。)

关闭并保存即可。

问题是 agvtool 修改了项目文件(不必要的,因为我们关心的所有构建号都在其他地方),而修改项目文件会导致构建取消。

此外,还要给这个问题点个赞 -- 真是个难题!


2
我不介意,但如果将其作为“Archive”方案中的预操作脚本添加,则似乎会在当前版本中“归档”,然后递增(与后操作相同)在Xcode 7中。 - Stanislav Smida
1
我还注意到,我必须将其设置为后置操作,以防止执行测试时出现取消警告,并且必须选择“提供构建设置来自”和我的框架。 - Kudit
@Olie 看起来它也取消了内置方案的预操作。你成功让它工作了吗?对我来说,它总是取消我的构建。 - user1398615
@user1398615 - 我也遇到了这个问题。我不得不将其添加为构建后操作。这并不好-我希望在构建开始时增加构建编号。但是至少在最后递增可以确保所有构建都有不同的编号。 - Matt Cline
@AlexanderRevo那你有什么建议呢?如果我需要构建号仅在成功构建后增加,当我将其添加到编辑方案作为后置操作时,脚本无法工作。 - Ahmed Shendy
显示剩余2条评论

3
另一种技术是完全跳过 agvtool 。 只需将此运行时脚本添加到您的构建阶段末尾(在复制束资源之后)。
  • 选择您的项目

选择您的项目

  • 选择构建阶段和+

选择构建阶段和+

  • 添加新的 Run Script 阶段

添加新的运行脚本阶段

  • 输入脚本

输入脚本

脚本,便于复制/粘贴:

buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

确保你的脚本在构建的拷贝捆绑阶段之后运行。


1
这种方法可能存在一个重大缺点,即这三行代码必须分别针对iOS应用程序和任何其他应用程序扩展目标执行,因为App Store Connect要求iOS应用程序和任何扩展之间的版本号和构建号匹配。如果/当目标处于不稳定状态时,此解决方案会增加一层手动维护,可能会变得有些烦人。当然,如果您的iOS应用程序是唯一的目标,则不存在此问题。 - Jonathan Thornton
这个回答帮助了我。之前的回答一直报错“Command PhaseScriptExecution failed with a nonzero exit code”。 - Pradeep Reddy Kypa

3

Xcode 13.2.1 - 超级简单

您可能会遇到版本升级脚本干扰构建过程的情况(如上所述)。如果是这种情况,请将其删除,并在“编辑方案”对话框中的后置构建操作中放置以下代码。它将升级项目内所有版本号,而不会引起问题。

cd "${PROJECT_DIR}" ; agvtool bump

这是我关于此主题的简短博客文章

经过大量测试,我意识到以下几点:

  • 很多答案省略了${PROJECT_DIR}周围的引号,这会阻止目录更改为项目文件夹。
  • 我们可以直接访问agvtool,而无需使用xcrun(至少当我安装了Xcode命令行工具时是如此,没有尝试过没有安装它们的情况)。
  • 新的构建系统会在构建阶段脚本使用agvtool修改项目文件时阻止存档成功完成。

1
是的,我最终在“编辑方案”中使用了后构建操作,这似乎是正确的方式,而不是将其作为构建阶段进行,因为Xcode现在使用“新构建系统”,我在某个地方读到它可以并行运行构建阶段。 - Ahmed Shendy
当您使用SwiftUI预览时,它无法正常工作,因为在agvtool bump之后项目本身正在重新加载,预览将再次开始构建过程,并且post action将再次被调用。 - feca

1
对我来说,carthage update 的构建阶段导致了这个问题。
还要检查是否有其他构建阶段的脚本修改了文件或代码。

0

通过将脚本代码放入构建方案的后置操作中,解决了这个问题。

产品 -> 方案 -> 编辑方案 -> 构建

展开构建方案,在其中找到后置操作。点击“+”并添加新的运行脚本。

就是这样。


0

我曾经遇到过同样的问题。但是我在仍然使用avgtool的情况下解决了它。

我使用了一个Build Phases Run Script,但不是作为最后一步,并使用了以下脚本导致错误:

"${DEVELOPER_BIN_DIR}/agvtool" next-version -all

我的解决方案是使用 Build Phases 中的 Run Script 作为最后一个阶段,并将脚本更改为以下内容

agvtool bump

-1

在我的情况下,在更新XCode版本后,我经常遇到这个问题。以下是我解决它的方法:

  1. 在XCode顶部工具栏上点击“锤子”图标。enter image description here

  2. 在Build System选项卡中选择“Legacy Build System”。

  3. 点击完成。

如果您正在处理旧项目且一切似乎都已编译,则此后应该可以构建应用程序而无需遇到此问题。


可怕的解决方案。旧的构建系统已经被弃用。 - Adam Różyński
@AdamRóżyński 这个答案是2020年的,你应该知道在这个行业中有很多遗留项目,修复它们通常需要花费大量的工作。 - Arka Mukherjee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接