我有一个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本身肯定是在那里,而不是我的自动构建脚本的任何部分。
这是什么文件,为什么要放在那里,我该怎么办呢? 我可以修改我的构建脚本以删除此文件以用于发布版本,但我担心这可能会影响代码签名过程。无论如何我会尝试看看会发生什么,但感觉这不是正确的事情。
任何建议都将受到赞赏。
答案 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构建系统复杂而且非常脆弱,无需添加更多可能出错或过时的脚本和内容。
以下是我最终要解决的问题(这很可怕,但这是我能找到的唯一让它最终发挥作用的东西)
在自动构建脚本中,修改.pbxproj
以使用Provisioning Style = Automatic;
搜索并替换Provisioning Style = Manual;
。同时将iOS Developer
替换为iOS Distribution
,以获取同一pbxproj文件中的代码签名内容。这两件事关闭了自动签名
运行xcodebuild
以与我在Xcode7中相同的方式构建(但不归档)项目。 Xcode编译应用程序并对其进行签名,但它尚未生效,因为它包含libswiftRemoteMirror.dylib
并且由于某种原因还没有获得任何权利文件
从应用包中删除libswiftRemoteMirror.dylib
(这会使签名无效)
通过从配置文件中提取权利位来生成应用程序包文件夹中的Entitlements.plist
(就像BlackBerry's SWSiOSResign.sh脚本所做的那样)
使用codesign --entitlements <file>
从那里,使用与bq/package_ipa.sh
相似的技术并复制SwiftSupport文件夹,然后将文件压缩为ipa
。
我无法实际使用package_ipa.sh
文件,我需要重新实现类似的逻辑,因为我需要引用Swift_2.3.toolchain
来获取SwiftSupport,因为我的应用程序仍然很快2.3 - 不是XcodeDefault.toolchain
(快速3)
似乎我应该能够将xcodebuild --archive
与其他一些东西结合使用以避免其中的一些步骤。我永远无法在Xcode7下工作,但如果我有时间,我可能会再次使用XC8
答案 3 :(得分:2)
只需转到构建设置即可解决问题。
答案 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上传。 它对我有帮助。