在使用嵌套框架进行 IPA 验证期间协​​同设计失败

Codesigning fails during IPA validation with nested frameworks

我正在尝试存档应用程序并准备在 App Store 中分发它。 在存档验证期间(可以从 XCode 的管理器触发)弹出以下错误:

据我所知,我的某些包含嵌套框架的框架无法进行代码签名。如果我删除所有包含嵌套框架的框架,它就会重新开始工作。

例如,以下框架会导致此类错误:

框架是使用 Carthage

构建的

这是我看到的日志输出:

2016-12-02 10:16:53 +0000  Processing step: IDEDistributionCodesignStep
2016-12-02 10:16:53 +0000  Applying entitlements delta for <IDEDistributionItem: 0x7fbc6f6e2a00 'com.hearst.ObjectMapper' '<DVTFilePath:0x7fbc530bde70:'/Users/gruener/Library/Developer/Xcode/Archives/2016-12-02/TestSubmitApp 02-12-16 11.16.xcarchive/Products/Applications/TestSubmitApp.app/Frameworks/Dto.framework/Frameworks/ObjectMapper.framework'>'> from <IDEiCloudEntitlementsProcessor: 0x7fbc6e036e70>: {
}
2016-12-02 10:16:53 +0000  Combining entitlements for <DVTFilePath:0x7fbc525ceb00:'/var/folders/3r/_6fw2smn4vj099_d7j2jtt0cg18svh/T/XcodeDistPipeline.bXb/Root/Payload/TestSubmitApp.app/Frameworks/Dto.framework/Frameworks/ObjectMapper.framework'>
    bundleIdentifier = com.hearst.ObjectMapper
    profileEntitlements = {
}
    storedEntitlements = {
}
    extraEntitlements = {
}
2016-12-02 10:16:53 +0000  Entitlements for <IDEDistributionItem: 0x7fbc6f6e2a00 'com.hearst.ObjectMapper' '<DVTFilePath:0x7fbc530bde70:'/Users/gruener/Library/Developer/Xcode/Archives/2016-12-02/TestSubmitApp 02-12-16 11.16.xcarchive/Products/Applications/TestSubmitApp.app/Frameworks/Dto.framework/Frameworks/ObjectMapper.framework'>'>: {
}
2016-12-02 10:16:53 +0000  Writing entitlements for <IDEDistributionItem: 0x7fbc6f6e2a00 'com.hearst.ObjectMapper' '<DVTFilePath:0x7fbc530bde70:'/Users/gruener/Library/Developer/Xcode/Archives/2016-12-02/TestSubmitApp 02-12-16 11.16.xcarchive/Products/Applications/TestSubmitApp.app/Frameworks/Dto.framework/Frameworks/ObjectMapper.framework'>'> to: /var/folders/3r/_6fw2smn4vj099_d7j2jtt0cg18svh/T/XcodeDistPipeline.bXb/entitlementsuaGdWl
2016-12-02 10:16:53 +0000  Running /usr/bin/codesign '-vvv' '--force' '--sign' 'A54D9A9C895E402713C0528523674342C777C825' '--preserve-metadata=identifier,resource-rules' '--entitlements' '/var/folders/3r/_6fw2smn4vj099_d7j2jtt0cg18svh/T/XcodeDistPipeline.bXb/entitlementsuaGdWl' '/var/folders/3r/_6fw2smn4vj099_d7j2jtt0cg18svh/T/XcodeDistPipeline.bXb/Root/Payload/TestSubmitApp.app/Frameworks/Dto.framework/Frameworks/ObjectMapper.framework'
2016-12-02 10:16:53 +0000  Warning: usage of --preserve-metadata with option "resource-rules" (deprecated in Mac OS X >= 10.10)!
2016-12-02 10:16:53 +0000  /var/folders/3r/_6fw2smn4vj099_d7j2jtt0cg18svh/T/XcodeDistPipeline.bXb/Root/Payload/TestSubmitApp.app/Frameworks/Dto.framework/Frameworks/ObjectMapper.framework: replacing existing signature
2016-12-02 10:16:53 +0000  /var/folders/3r/_6fw2smn4vj099_d7j2jtt0cg18svh/T/XcodeDistPipeline.bXb/Root/Payload/TestSubmitApp.app/Frameworks/Dto.framework/Frameworks/ObjectMapper.framework: invalid resource directory (directory or signature have been modified)
2016-12-02 10:16:53 +0000  /usr/bin/codesign exited with 1

我还尝试用 Fastlane 的 GYM 构建 IPA 文件。在此它有效,但是当我尝试提交应用程序时,我收到此错误:

WARNING ITMS-90686: "The binary you uploaded was invalid. (1102)"

谷歌搜索错误代码 1102 没有结果;

你能看看Dto.framework和ObjectMapper.framework是什么架构吗? 你可以用

来做到这一点
$ file /path/to/Dto.framework/Dto

这似乎与我在为设备和模拟器构建的一些嵌入式框架中遇到的问题类似。模拟器 archs 是通过调试构建的,它们不能提交到 AppStore(临时存档效果很好)。如果它们包含模拟器架构(x86_64i386),您可以使用此博客中描述的脚本在应用程序的发布构建期间去除模拟器架构:https://gkbrown.org/2015/12/17/creating-a-universal-ios-framework-in-xcode-7/

我终于明白问题出在哪里了

我 运行 lipo info /path/to/Dto.framework/Dto 在一个终端中,一切似乎都很好 - 不必要的架构被正确地剥离了。但是仔细观察嵌套框架,我意识到它们并非如此。

相反,我发现在使用 Carthage 时,您必须 link 应用级别的所有框架,并且不得将它们封装在您自己的框架中。

所以为了解决这个问题,我删除了 Copy files Phase(它将所有框架复制到框架目录)。 Carthage 足够聪明,可以识别这一点,还会检查嵌套的依赖项并为您构建它们。您唯一需要做的就是将它添加到 XCode.

中的 Link 库构建阶段