【问题标题】:Failed to verify bitcode while exporting archive for ad hoc distribution - tried Xcode 8.3.3 & Xcode 9为临时分发导出存档时无法验证位码​​ - 尝试了 Xcode 8.3.3 和 Xcode 9
【发布时间】:2018-03-06 08:46:51
【问题描述】:

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

我已经阅读了 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 标志。我还尝试在框架目标的其他 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 的构建导入错误的电子邮件。

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

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

【问题讨论】:

    标签: ios xcode app-store-connect bitcode


    【解决方案1】:

    错误描述将​​我带入了错误的方向以找到解决方案。

    此错误与位码无关。 当框架包含模拟器切片时出现(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 窗口中间部分左上角附近的 +。如果您指向它足够长的时间,它会显示添加新构建阶段。
    • 从单击 + 时弹出的菜单中选择“新建运行脚本阶段”
    • 点击刚刚出现的运行脚本旁边的箭头。
    • 将上述脚本复制并粘贴到“Shell”一词下方的适当区域。您无需更改任何其他内容。
    • 像往常一样构建/存档您的项目,只是现在您不会遇到那些烦人的“验证位码失败”错误。 :-)

    【讨论】:

    • 您是如何删除 (i386 x86_64) 的,从哪里删除?当我单击“+”btn 添加 Runscript,然后按照提供的方式编写给定的脚本时,归档时会出现同样的问题。是的,我还没有删除 i386 x86_64,因为我不知道如何
    • 请查看此@Vipin。虽然我的 enableBitcode = NO 总是,我不想将它设置为 YES
    • 在 Xcode 10 中,通过添加此运行脚本,我现在遇到了崩溃,这表明找不到 Alamofire:dyld:未加载库:@rpath/Alamofire.framework/Alamofire 引用自:/var /containers/Bundle/Application/A2C3A261-242A-4AF0-A900-CC68DA347B67/myapp.app/myapp 原因:找不到图像
    • 嘿,添加后我收到错误“Command PhaseScriptExecution failed with a nonzero exit code”
    • @m.alqadi,让您没有意外地在脚本中犯任何语法错误。
    【解决方案2】:

    我必须在 Build Settings 中将 Enable Bitcode 设置为“NO”

    【讨论】:

    • 这肯定是一个解决方案,但不是最好的。您在整个项目中禁用了位码。
    【解决方案3】:

    尝试以下方法:

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

    【讨论】:

    • 我实际上在构建设置中使用了 BITCODE_GENERATION_MODE。编辑我的问题以纠正错字。我将尝试在构建阶段添加新的“复制文件阶段”。将在其中添加抱怨框架,并让您知道我的发现。
    • 嘿 Roy K,因为 Copy Framework Script Build 阶段在 xcode 构建阶段不可见,所以我添加了 Copy file 阶段,其中包含框架。但没有运气:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 2012-02-13
    相关资源
    最近更新 更多