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

时间:2016-09-13 23:44:22

标签: ios swift xcode itunesconnect xcode8

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

我有一个自动构建管道,它基本上运行xcodebuild以在专用构建机器上生成发布二进制文件,在我对所有这些进行排序后(Xcode 8的自动代码签名确实搞砸了所有内容),现在当我将我的应用程序上传到iTunes连接时,它会因此错误而失败:

  

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

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

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

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

任何建议都将受到赞赏。

6 个答案:

答案 0 :(得分:4)

在我的情况下,我得到了ERROR ITMS-90171,因为我使用的是自定义框架。

  

“无效的捆绑包结构 - 二进制文件'MyFramework.framework / libswiftRemoteMirror.dylib'

(我的申请没有得到。)

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

答案 1 :(得分:3)

我在安装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

答案 2 :(得分:3)

我永远无法让命令行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. 通过从配置文件中提取权利位来生成应用程序包文件夹中的Entitlements.plist(就像BlackBerry's SWSiOSResign.sh脚本所做的那样)

    1. 使用codesign --entitlements <file>

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

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

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

答案 3 :(得分:2)

只需转到构建设置即可解决问题。

enter image description here

答案 4 :(得分: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目标设置中,将Release配置(或用于构建的任何内容)的Deployment Postprocessing设置为Yes

答案 5 :(得分:0)

只需在Xcode中存档您的版本,然后右键单击存档文件 - &gt;在finder中显示 - &gt;右键单击 - &gt;显示包裹内容 - &gt;产品 - &gt;申请 - &gt;复制.app文件生成有效载荷&amp;使用Application Loader上传。 它对我有帮助。