导出存档以进行临时分发时无法验证bitcode - 尝试过Xcode 8.3.3& Xcode 9

时间:2017-09-25 11:34:42

标签: ios xcode itunesconnect bitcode

包含我们框架的应用程序抱怨在导出存档以进行Ad-hoc分发时缺少bitcode。

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

我在SO

上发布了类似的问题

Error while exporting with Bitcode enabled (symbol not found for architecture armv7)

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

New warnings in iOS 9

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

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

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

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

显示2段

  

segname __LLVM

     

segname __LLVM

但是在导出档案时,Xcode仍然抱怨缺少bitcode。

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

  

在处理您的iOS应用程序APP_NAME 1.0(4)时,应用程序细化过程中出现错误,您的应用程序无法细化。如果您的应用包含bitcode,则bitcode处理可能失败。由于这些错误,您的应用版本将无法提交审核或放置在App Store中。有关可能有助于解决此问题的信息,请参阅技术说明2432。

PS:禁用bitcode不是我们的选择,因为主机应用需要支持bitcode。

Error while exporting the Archieve

3 个答案:

答案 0 :(得分:58)

错误描述让我走错了方向找到解决方案。

此错误与bitcode无关。 当框架包含模拟器切片(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中打开您的项目。
  • 通过单击Xco​​de左侧窗格中最左侧的图标(当您指向它时显示“显示Project Navigator”的图标),确保您在“Project Navigator”中查看项目。
  • 单击导航器窗口顶部的项目,以便将其选为目标
  • 此时,在Xcode窗口的中间部分,您会看到顶部附近出现了几样。常规,功能,资源标签,信息等。其中之一是Build Phases - 点击它。
  • 单击Xco​​de窗口中间部分左上角附近的+。如果你指的是足够长的时间,它会说添加新构建阶段。
  • 从单击+
  • 时弹出的菜单中选择“新建运行脚本阶段”
  • 单击刚出现的“运行脚本”旁边的箭头。
  • 将上述脚本复制并粘贴到“Shell”字样正下方的相应区域。你不应该改变其他任何东西。
  • 像平常一样构建/存档您的项目,只是现在您不会得到那些令人讨厌的“无法验证bitcode”错误。 : - )

答案 1 :(得分:8)

我必须将启用Bitcode设置为“否”&#39;在构建设置

答案 2 :(得分:1)

尝试以下方法:

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