什么是 libswiftRemoteMirror.dylib 以及为什么它包含在我的应用程序包中?

What is libswiftRemoteMirror.dylib and why is it being included in my app bundle?

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

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

ERROR ITMS-90171: "Invalid Bundle Structure - The binary file 'MyApp.app/libswiftRemoteMirror.dylib' is not permitted. Your app can't contain standalone executables or libraries, other than the CFBundleExecutable of supported bundles. Refer to the Bundle Programming Guide at https://developer.apple.com/go/?id=bundle-structure for information on the iOS app bundle structure."

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

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

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

如有任何建议,我们将不胜感激。

我运行在安装Xcode8后遇到了同样的问题,通过shenzhen.

构建

我决定看看 Fastlane as an alternative, and their gym 程序生成一个可以提交给 Apple 的 ipa。

我很容易将对 ipa(深圳的可执行文件)的调用替换为对 gym 的调用,其余的构建和上传脚本无需修改即可运行。

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

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

我永远无法让命令行 xcodebuild 与自动代码签名一起工作。我假设是因为自动构建机器 运行s 作为一个不同的帐户,只能通过 SSH 访问 - 它从来没有 "full" 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. 通过从配置文件中提取授权位,在应用程序包文件夹中生成一个 Entitlements.plist(就像 BlackBerry's SWSiOSResign.sh 脚本所做的那样)

    1. 使用 codesign --entitlements <file>

    2. 重新签署应用程序包
    3. 从那里,使用与 bq/package_ipa.sh 类似的技术并复制 SwiftSupport 文件夹,然后将文件压缩到 ipa.

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

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

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

"Invalid Bundle Structure - The binary file 'MyFramework.framework/libswiftRemoteMirror.dylib'

(我的申请没拿到。)

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

只需转到构建设置并按原样操作,您的问题就会解决。

只需从 Xcode 存档您的构建 右键单击​​存档文件 -> 在查找器中显示 -> 右键单击​​ -> 显示包内容 -> 产品 -> 应用程序 -> 复制 .​​app 文件生成负载并上传使用应用程序加载器。 它对我的情况有帮助。

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

为了找到根本原因,我只是在 XCode.app 中做了 'grep -Ril "libswiftRemoteMirror" .'(我目前有 10.1)并找到了 ./Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer/Library/Xcode/Plug-ins/XCLanguageSupport.[=26= .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 目标设置中将部署后处理设置为是 用于您的发布配置(或您用于构建的任何内容)