为临时分发导出存档时无法验证位码​​ - 已尝试 Xcode 8.3.3 和 Xcode 9

Failed to verify bitcode while exporting archive for ad hoc distribution - tried Xcode 8.3.3 & Xcode 9

包含我们框架的应用程序在导出存档以进行临时分发时抱怨缺少位码。

我已经阅读了Apple提供的这方面的文档 Technical Note TN2432。文档中列出的可能根本原因与我们的场景不一样。 (我们没有使用汇编指令或格式错误的 info.plist 文件)

我已经解决了 SO

上发布的类似问题

Is it possible to create a universal iOS framework using bitcode?

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

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

我使用 suggested 命令检查我生成的框架中是否存在位码段

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

显示2段

segname __LLVM

segname __LLVM

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

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

While processing your iOS app, APP_NAME 1.0(4), errors occurred in the app thinning process, and your app couldn’t be thinned. If your app contains bitcode, bitcode processing may have failed. Because of these errors, this build of your app will not be able to be submitted for review or placed on the App Store. For information that may help resolve this issue, see Tech Note 2432.

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

尝试以下操作:

  • 确保此框架已添加到构建阶段的复制框架脚本下。
  • 使用BITCODE_GENERATION_MODE代替BITCODE_GENERATION_CODE

错误描述让我误入了寻找解决方案的方向。

此错误与位码无关。 当框架包含模拟器切片时出现 (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 左侧窗格中最左侧的图标(显示 "show Project Navigator" 的图标,确保您正在 "Project Navigator" 中查看您的项目你指着它。
  • 单击导航器顶部的项目 window,以便将其选为目标
  • 此时,在 Xcode window 的中间部分,您会看到顶部附近出现了一些东西。常规、功能、资源标签、信息等。其中之一是构建阶段——点击它。
  • 单击 Xcode Window 中间部分左上角附近的 +。如果你指向它的时间足够长,它会说添加新的构建阶段。
  • Select "New Run Script Phase" 从您单击 +
  • 时弹出的菜单中
  • 单击刚刚出现的 运行 脚本旁边的箭头。
  • 将上述脚本复制并粘贴到单词 "Shell" 正下方的适当区域。您不必更改任何其他内容。
  • Build/Archive 您的项目像往常一样,只是现在您不会遇到那些烦人的 "failed to verify bitcode" 错误。 :-)

我必须在构建设置中将启用位码设置为 'NO'