【问题标题】:What is libswiftRemoteMirror.dylib and why is it being included in my app bundle?什么是 libswiftRemoteMirror.dylib,为什么它包含在我的应用程序包中?
【发布时间】:2017-01-21 16:11:30
【问题描述】:

我有一个 iOS 应用程序,我最近切换到 Xcode 8。 作为其中的一部分,我们从 swift 2.2 切换到 2.3(swift 3 稍后会推出)。

我有一个自动构建管道,它基本上运行 xcodebuild 以在专用构建机器上生成发布二进制文件,在我整理完所有这些之后(Xcode 8 的自动代码签名真的把所有事情都搞砸了),现在当我将我的应用程序上传到 iTunes 连接,失败并出现以下错误:

错误 ITMS-90171:“无效的捆绑包结构 - 不允许使用二进制文件 'MyApp.app/libswiftRemoteMirror.dylib'。您的应用不能包含独立的可执行文件或库,除了受支持捆绑包的 CFBundleExecutable。请参阅https://developer.apple.com/go/?id=bundle-structure 上的 Bundle Programming Guide 以获取有关 iOS 应用程序包结构的信息。”

果然,如果我解压 .ipa 文件看一下,那里有libswiftRemoteMirror.dylib

如果我通过 Xcode 为 iTunes 存档/导出,那么它会生成一个没有 libswiftRemoteMirror.dylib 的应用程序包,但是我的应用程序的所有其他版本似乎都有它。即使只是在 Xcode 中进行调试构建,然后查看输出显示 libswiftRemoteMirror.dylib 位于我的应用程序包中,这表明 Xcode 本身肯定将它放在那里,而不是我的自动构建脚本的任何部分。

这个文件是什么,为什么放在那里,我应该怎么做? 我可以修改我的构建脚本以删除此文件以进行发布构建,但我担心这可能会影响代码签名过程。无论如何我都会尝试一下,看看会发生什么,但感觉这样做不太正确。

任何建议将不胜感激。

【问题讨论】:

  • 我会认为这是需要与您的应用程序捆绑在一起的快速二进制文件,因为如果 ABI 不完整。在正式发布之前,iTunes 是否支持 Swift 2.3?我想您无法验证是因为您的应用程序不是用当前支持的语言编写的。
  • @RobertMasen:Xcode 8 GM 上周发布,决赛于昨天某个时候发布。 Swift 2.3 和 3 已经可以使用了。
  • 从查看日志来看,我认为添加文件的步骤是 CopySwiftLibs 步骤,它使用一堆参数调用 builtin-swiftStdLibTool。 Xcode 构建(有效)和 xcodebuild 构建(具有此文件)之间的三个参数不同: Xcode 包含一个标志 --unsigned-destination: <DerivedData>/BuildProductsPath/SwiftSupport xcodebuild 包含两个不同的标志:1.--resource-destination <path-to-built-app-bundle> 2.--resource-library libswiftRemoteMirror.dylib 我没有还知道要拉哪些句柄来使它们相似。

标签: ios swift xcode app-store-connect xcode8


【解决方案1】:

最近开始在我们的项目中使用 Swift 并遇到同样的错误。

为了找到根本原因,我只是执行了 'grep -Ril "libswiftRemoteMirror" 。'在 XCode.app 中(我目前有 10.1)并找到 ./Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer/Library/Xcode/Plug-ins/XCLanguageSupport.xcplugin/Contents/Resources/swift-stdlib-tool。 xcspec 文件。它说:

     // SWIFT_RESOURCE_DESTINATION and SWIFT_RESOURCE_LIBRARY allow us to copy
    // libswiftRemoteMirror.dylib into place so that memory debugging tools have access to it
    // on device.
    // We disable these options in "DEPLOYMENT" modes, so that the libswiftRemoteMirror.dylib
    // does not make its way into archives submitted to the App Store.


所以解决方案很简单 - 在 XCode 目标设置中将 Deployment Postprocessing 设置为 Yes 以用于您的发布配置(或您用于构建的任何内容)

【讨论】:

    【解决方案2】:

    只需从 Xcode 归档您的构建,右键单击归档文件 -> 在 finder 中显示 -> 右键单击​​ -> 显示包内容 -> 产品 -> 应用程序 -> 复制 .​​app 文件生成有效负载并使用 Application Loader 上传。 这对我有帮助。

    【讨论】:

    • 我的问题是我正在使用无人值守的命令行构建。没有右键单击:-)
    【解决方案3】:

    只需转到构建设置并按照您的问题解决即可。

    【讨论】:

      【解决方案4】:

      在我的例子中,我收到了 ERROR ITMS-90171,因为我使用的是自定义框架。

      "无效的 Bundle 结构 - 二进制文件 'MyFramework.framework/libswiftRemoteMirror.dylib'

      (我的申请没有得到它。)

      我试过健身房but it got stuck at xcrun。因此,我尝试为我拥有的每个自定义框架在构建短语中使用rm -rf libswiftRemoteMirror(使用自定义运行脚本),有趣的是我没有破坏任何东西:它奏效了。

      【讨论】:

      • 你能详细说明一下吗,怎么做?
      • 太棒了!这件事对我有用。谢谢nyan nyan
      • @gaurav414u 太棒了!
      • 我从 Xcode 7.x --> Xcode 8 GM 遇到了这个问题。现在在 Xcode 8.1 中,在依赖框架中使用此技术,上传成功。我还使用 Swift 2.3 作为向 Swift 3 过渡的过渡。
      • 这是我在我的案例中使用的脚本,希望它可以帮助其他人:rm -rf $SRCROOT/Carthage/Build/iOS/RocketData.framework/libswiftRemoteMirror.dylib
      【解决方案5】:

      我永远无法让命令行 xcodebuild 与自动代码签名一起工作。我假设是因为自动构建机器作为一个只能通过 SSH 访问的不同帐户运行 - 它从来没有作为该用户帐户运行“完整”Xcode,并且它的登录钥匙串或类似的东西中没有任何证书。

      我不想使用shenzhen 之类的东西,因为我过去在这类事情中只有糟糕的经历。 Xcode 构建系统足够复杂和脆弱,无需添加更多脚本和可能出错或过时的东西。

      这就是我最终解决问题的方法(这太可怕了,但这是我能找到的唯一让它最终起作用的东西)

      1. 在自动构建脚本中,编辑 .pbxproj 以搜索 Provisioning Style = Automatic; 并将其替换为 Provisioning Style = Manual;。还要将 iOS Developer 替换为 iOS Distribution 用于同一 pbxproj 文件中的代码签名内容。这两件事会关闭自动签名

      2. 运行 xcodebuild 以与我在 Xcode7 中相同的方式构建(但不归档)项目。 Xcode 编译应用程序并对其进行签名,但它还不是有效的,因为它包含 libswiftRemoteMirror.dylib 并且由于某种原因还没有任何权利文件

      3. 从应用程序包中删除libswiftRemoteMirror.dylib(这会使签名无效)

      4. 通过从配置文件中提取权利位在 app bundle 文件夹中生成 Entitlements.plist(就像 BlackBerry's SWSiOSResign.sh 脚本所做的那样)

        1. 使用codesign --entitlements <file>重新签署应用程序包

        2. 从那里,使用与 bq/package_ipa.sh 类似的技术并复制 SwiftSupport 文件夹,然后将文件压缩到 ipa

      我实际上不能使用package_ipa.sh 文件,我需要重新实现类似的逻辑,因为我需要引用Swift_2.3.toolchain 来获取SwiftSupport,因为我的应用程序仍然是swift 2.3 - 而不是XcodeDefault.toolchain(哪个很快 3)

      看来我应该能够将xcodebuild --archive 与其他一些东西结合使用,以避免其中一些步骤。我永远无法让它在 Xcode7 下工作,但如果我有时间,我可能会在 XC8 上再试一次

      【讨论】:

      【解决方案6】:

      我在安装 Xcode 8 后遇到了同样的问题,通过 shenzhen 构建。

      我决定将Fastlane 作为替代方案,他们的gym 程序会生成一个可以提交给Apple 的ipa。

      对我来说,将ipa(深圳的可执行文件)的调用替换为gym 的调用相当容易,并且我的其余构建和上传脚本无需修改即可工作。

      如果您更喜欢直接构建,我从gym 自述文件中提取了以下内容。它生成一个.xcarchive,其中包含一个.app 文件,但没有libswiftRemoteMirror.dylib。我自己不使用那种流程,所以我不能说你会从那里开始。

      xcodebuild \
        -scheme Scheme \
        -workspace Project.xcworkspace \
        -configuration 'Release' \
        -destination 'generic/platform=iOS' \
        -archivePath './Output.xcarchive' \
        archive
      

      【讨论】:

        猜你喜欢
        • 2012-01-07
        • 2014-12-16
        • 1970-01-01
        • 2011-08-18
        • 2012-01-29
        • 1970-01-01
        • 2021-12-04
        • 2012-08-20
        • 1970-01-01
        相关资源
        最近更新 更多