无法验证位代码,导出存档以进行 Ad Hoc 分发失败 - 尝试了 Xcode 8.3.3 和 Xcode 9。

26

我们的框架在进行Ad-hoc分发时导出存档时会报错缺少bitcode。

我已经阅读了苹果提供的有关文档Technical Note TN2432。该文档列出的可能根本原因与我们的情况不符。(我们不使用汇编指令,也没有格式错误的info.plist文件)

我阅读了SO上发布的类似问题:

使用启用bitcode时导出时出错(找不到armv7架构的符号)

是否可以使用bitcode创建通用iOS框架?

iOS 9新警告

但是提供的解决方案似乎都不起作用。

我尝试在用户自定义构建设置中添加BITCODE_GENERATION_MODE标志。我还尝试在框架目标中的其他C标志中添加-fembed-bitcode-标记和-fembed-bitcode

我使用建议的命令检查我的生成的框架中是否存在bitcode段。

otool -l -arch arm64 <framework_name> | grep __LLVM

它显示了2个段

segname __LLVM

segname __LLVM

但在导出存档时,Xcode仍然抱怨缺少位码。

我尝试将应用程序上传到App Store以验证是否由于Xcode版本(我尝试了8.3.3和9.0)引起此问题,但我收到以下电子邮件,指出来自iTunes Store的构建导入错误。

在处理您的iOS应用程序APP_NAME 1.0(4)时,应用程式削减过程中发生错误,并且无法对您的应用进行瘦身。如果您的应用程序包含位码,则位码处理可能已失败。由于这些错误,您的应用程序的此版本将无法提交审核或放置在App Store上。有关可帮助解决此问题的信息,请参阅Tech Note 2432。

PS: 对我们来说禁用位码不是一个选项,因为主机应用需要支持位码。

导出归档时出错

4个回答

71

错误描述让我走了一条错误的路,无法找到解决方案。

这个错误与位码无关,它出现在框架包含模拟器切片 (i386 x86_64) 时。

在打包存档之前移除它们可以解决问题。

将以下代码添加到目标构建阶段中的运行脚本阶段有助于消除错误。

APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"

# This script loops through the frameworks embedded in the application and
# removes unused architectures.
find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK
do
FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)
FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"
echo "Executable is $FRAMEWORK_EXECUTABLE_PATH"

EXTRACTED_ARCHS=()

for ARCH in $ARCHS
do
echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME"
lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"
EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")
done

echo "Merging extracted architectures: ${ARCHS}"
lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}"
rm "${EXTRACTED_ARCHS[@]}"

echo "Replacing original executable with thinned version"
rm "$FRAMEWORK_EXECUTABLE_PATH"
mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH"

done

致谢:http://ikennd.ac/blog/2015/02/stripping-unwanted-architectures-from-dynamic-libraries-in-xcode/

如果您不知道如何在Xcode项目中添加运行脚本阶段,因为您可能正在使用Cordova或Ionic构建项目,而且您从未学过关于Xcode的东西,则可以按照以下方式执行:

  • 在Xcode中打开您的项目。
  • 通过单击Xcode左侧窗格中最左边的图标(指向“显示项目导航器”)来确保您在“项目导航器”中查看您的项目。
  • 在导航窗口顶部单击您的项目,以将其选定为您的目标。
  • 此时,在Xcode窗口的中间部分,您将看到顶部附近出现了几个东西。常规、功能、资源标记、信息等等。其中之一是生成阶段——单击它。
  • 单击Xcode 窗口中间部分靠近左上角的+。如果您指向它足够长时间,它会说“添加新的生成阶段”。
  • 从弹出菜单中选择“New Run Script Phase”。
  • 单击刚刚出现的运行脚本旁边的箭头。
  • 将上面的脚本复制并粘贴到“Shell”下方的适当区域中。您不需要更改其他内容。
  • 像往常一样构建/归档您的项目,只是现在您将不会收到那些烦人的“无法验证位码”的错误信息。:-)

你是如何移除(i386 x86_64)的?从哪里开始?当我点击“+”按钮添加Runscript时,按照提供的脚本编写,它在归档时会出现相同的问题。是的,我还没有删除i386 x86_64,因为我不知道如何操作。 - Adarsh Roy Choudhary
请查看一下,@Vipin。虽然我的 enableBitcode 始终为 NO,但我不想将其设置为 YES。 - Adarsh Roy Choudhary
3
在 Xcode 10 中,通过添加此运行脚本,我现在遇到了崩溃问题,提示找不到 Alamofire 库:dyld: Library not loaded: @rpath/Alamofire.framework/Alamofire Referenced from: /var/containers/Bundle/Application/A2C3A261-242A-4AF0-A900-CC68DA347B67/myapp.app/myapp Reason: image not found - Ashutosh
1
嘿,在添加之后我遇到了错误 "Command PhaseScriptExecution failed with a nonzero exit code"。 - Marwan Alqadi
谢谢,@Vipin,这与Bitcode过程无关! - Nirav Jain
显示剩余4条评论

11

我必须在构建设置中将“启用位代码”设置为“否”


2
这是一个解决方法,但并不是最好的方法。你在整个项目中禁用了位码。 - Yucel Bayram

1

请尝试以下操作:

  • 确保此框架已添加到“构建阶段”下的复制框架脚本中。
  • 使用BITCODE_GENERATION_MODE而不是BITCODE_GENERATION_CODE

我实际上在构建设置中使用了BITCODE_GENERATION_MODE。我编辑了我的问题以更正拼写错误。我将尝试在构建阶段中添加新的“复制文件阶段”。将在其中添加 complaining 框架,并告知您我的发现。 - Vipin
嘿,Roy K,由于在Xcode构建阶段中未显示复制框架脚本构建阶段,我添加了带有框架的复制文件阶段。但是没有运气:( - Vipin

1

我曾经遇到过同样的问题。但在我的情况下,经过一天的努力,我发现我的系统内存不足。只要我在系统中创建了一些空间,所有问题都得到了解决。


1
这是我的问题。谢谢。 - Miguelp25

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