应用程序提交失败 - 1+ 损坏的二进制文件/非公共 API 使用,没有其他详细信息

Posted

技术标签:

【中文标题】应用程序提交失败 - 1+ 损坏的二进制文件/非公共 API 使用,没有其他详细信息【英文标题】:App submission failed - 1+ corrupted binaries/non-public API usage and no additional details 【发布时间】:2018-01-27 16:55:30 【问题描述】:

我一直在将我的应用提交到 App Store 进行试飞,在构建 11 之后,我收到了来自 Apple 的电子邮件失败:

非公开 API 使用:应用包含一个或多个损坏的二进制文件。重新构建应用并重新提交

我没有从他们那里得到更多细节。没有方法名称或类或任何东西。

例如,我提交了 build 15,它实际上是 build 11 的精确副本(它通过了!),但版本号有问题,build 15 失败了。

我相信这是 Apple 的错误,但除了上面的段落之外,我无法证明这一点。构建 1-11 运行良好,并且能够被上传和分发。

我使用的是 Xcode 9.1 和 9.2,两者都报同样的错误。

我还通过 DTS 联系了 Apple,他们说他们无法帮助我。

我现在该怎么办?

【问题讨论】:

它说私有 API 被拒绝.. 我明白了,我只是不知道它突然认为我在使用什么私有 api。它没有让我知道什么或在哪里...... 我看到了同样的事情(在类似的情况下;自上次接受的构建以来发生了微小的变化,但现在被拒绝了)。我目前的理论是一个新的 API 已被标记为“私有”,并且我有一个同名的方法。同时,他们顽皮的 API 列表代码中有一个错误,它会吐出“损坏的二进制文件”malarkey。工作理论。目前正在尝试提交一个简单的应用程序并逐渐向其添加内容以使其失败。 这也是我的理论。我刚刚完成了我的应用程序并去向我的测试人员提交了一个 GM 构建并开始获取它。很烦人 自周五以来我们遇到了同样的问题。我们还尝试上传之前已获得批准但被拒绝并显示相同消息的旧版本应用程序。 【参考方案1】:

我遇到了这个确切的问题。我使用 CommonCrypto 作为“假”框架。我删除了它,并切换到 the method described by the accepted answer in this thread,iTunesConnect 接受了我的构建。

在使用pod update 时,通过 XCode 获得 Swift 4 转换警告或在 cmd 输出中显示 "CommonCryptoModule" 似乎是您是否受到此问题影响的有力指标。

【讨论】:

我通过 CocoaPods 安装了一些内部库,这些库使用作为通用依赖项安装的“假”框架(也通过 CocoaPods)。我改为让他们在他们的 Podspecs 中的 pod_target_xcconfig 设置中引用他们自己的模块映射,然后 iTunes Connect 接受了构建。 谢谢你,Ben,你真的拯救了我的一天! ) 你用的是什么方法?我目前正在使用这个框架:github.com/soffes/CommonCrypto,它似乎使用了答案中描述的模块映射方法。 我更改了我的内部库以引用自身内部的 CommonCrypto 模块映射。我怀疑包含一个名为“CommonCrypto”的框架是什么触发了非公共 API 错误?那么也许这个框架也引起了问题? 我还在 Carthage 使用 soffes/CommonCrypto。删除两者并使用接受的答案添加 CommonCrypto。正如评论者所说,不需要第 5 步。终于成功提交到TestFlight!【参考方案2】:

我们未启用位码的项目于 2018 年 1 月 26 日星期五开始失败。在这些项目的 Build Settings 中将 Enable Bitcode 设置为 Yes 解决了这个问题。

【讨论】:

如果您需要在项目中禁用位码怎么办? 如果您需要在项目中禁用位码怎么办? @ZackShapiro 这是我们面临的同样问题。 Apple 在 ios 上不需要启用 Bitcode。【参考方案3】:

经过对这部分的大量调查,我们终于找到了这个问题的问题: 似乎 Apple 为支持 32 位和 64 位的应用程序提供了此错误。

苹果给了thisMac Appstore的提醒,但iOS应用似乎也受到了影响。

因此,解决方案是支持位码或通过从构建设置中删除对 ARMV7 和 ARMV7S 或以下有效架构的支持来放弃对 32 位设备的支持。这意味着您的应用程序只能在 iPhone 5S 及更高版本上运行。 我希望这可以帮助别人。 谢谢!

【讨论】:

也不支持 iPad 第 4 代及更低版本。也没有 iPad mini! 发现 CommonCrypto 是根本问题。似乎他们使用了一些未记录的 API 用法。如果您从项目中删除它,提交将正常工作。【参考方案4】:

自周六以来遇到了同样的问题。在我们的案例中进行了长时间的反复试验,打开 Bitcode 不起作用。 我的podfile 的以下部分是原因:

post_install do |installer| 
  puts("Set deployment target")
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '10.3'
    end
  end
end

在我删除这个之后,它的处理没有错误(仍然关闭了 Bitcode)。虽然设置部署目标突然导致拒绝,但我真的很困惑。

【讨论】:

这也解决了我们的应用商店拒绝问题。感谢您分享这些信息!【参考方案5】:

似乎问题已在 iTunes Connect 后端解决。 在构建 45 之后,我们昨天晚上通过了。试图从所有这些更改中找出是什么解决了问题 - 现在似乎也在初始构建中。

所以我可以在外面度过三天......

【讨论】:

太棒了!今天尝试重新提交。感谢更新 我刚刚尝试重新提交并得到同样的失败错误:Non-public API usage: The app contains one or more corrupted binaries. Rebuild the app and resubmit. @Zack Shapiro 你用 cocoapods 吗? 昨天下午又遇到了这个错误。真的很奇怪。在我们启用位码(已禁用)后它现在消失了,但不确定它现在是否暂时工作并且会再次出现,或者这是否真的解决了问题【参考方案6】:

最近从 2018 年 1 月 26 日起,在没有任何通知或公告的情况下,苹果做了一些与 swift 旧代码相关的更改,不再适用于在应用商店提交应用程序。我的项目中根本没有使用CommonCrypto

我也面临这个问题,我在苹果论坛和各种平台上进行了大量搜索并发布了一个关于 非公共 API 使用的问题:该应用程序包含一个或多个损坏的二进制文件。重建应用并重新提交

了解后,对于那种 Invalid Binary 拒绝没有单一的解决方案。我提到了一些最近适用于某些用户的可能解决方案。

    如果您长期使用并包含自 swift 2.0 以来的一些 swift 框架或类,请更新您的 cocoa-pods,然后只需更新您的可可豆荚,支持 swift 4 并以 10.0 为目标,该错误就会消失。 我谈过的一位用户在 Build 设置中启用了 bitcode,这个问题为他解决了。 一些用户删除了未使用的代码、类和框架,这些代码、类和框架直接在没有 cocoa-pods 问题的代码中使用。 对我来说,我在左侧面板中收到如下图所示的警告

一旦我转换为swift4,我就会收到以下警告:

不推荐在 Swift 4 模式下使用 Swift 3 @objc 推理。 请解决已弃用的@objc 推理警告,测试您的代码 启用“使用已弃用的 Swift 3 @objc 推理”日志记录,以及 然后通过更改“Swift 3 @objc Inference”构建禁用推理 将“appname”目标设置为“默认”。

为了修复这个警告,我使用那个答案:The use of Swift 3 @objc inference in Swift 4 mode is deprecated?

之后我需要在swift3 类公共方法中添加@objc,该方法我在我的objective-c 类中使用桥接

我还检查了左侧面板中的其他警告,还有一些其他应用程序目标的依赖警告可能对其他也有帮助。

希望这个答案对一些尚未找到答案的用户有用,并且可能会有所帮助。

【讨论】:

【参考方案7】:

我能够自己解决它,这就是我所做的:

Bitcode 在我的项目中被禁用并保持禁用状态 我删除了 3 个 Pod,一个是 CommonCrypto,我忘记了我有(另外两个是 QRCode 和 SwiftyJSON) 我也在构建设置中删除了他们的链接器标志

希望对你有帮助!

【讨论】:

【参考方案8】:

上传第 9 个版本后,我自己找到了解决方案。

    我在桥接器使用的 Objective-c 源代码中使用了一些 swift 类。在您构建项目时,您可以看到与项目相关的左侧面板警告,并且有一行表示 swift 4 的更新。 转换 swift 4 后,我收到更多警告,例如使用 @objc 将 swift 3 转换为最新的 swift 4 代码。

    您可以在 swift 课堂上查看如何使用 @objc,查看此链接:The use of Swift 3 @objc inference in Swift 4 mode is deprecated?

    然后我更改了未使用的配置文件。

然后我上传应用程序,它就可以工作了。如果有人需要帮助,请告诉我

【讨论】:

但我的是 Xcode 8.3.2,Swift-4 的警告不会出现,因为 Swift-4 来自 Xcode-9。我现在不想升级到 Xcode-9。但是我仍然遇到这个问题,该怎么办??【参考方案9】:

我在 Carthage 中使用了 soffes/CommonCrypto。删除 CommonCrypto.framework 对我有用,请查看此链接如何导入 commoncryto 框架: http://ioscake.com/importing-commoncrypto-in-a-swift-framework.html

【讨论】:

以上是关于应用程序提交失败 - 1+ 损坏的二进制文件/非公共 API 使用,没有其他详细信息的主要内容,如果未能解决你的问题,请参考以下文章

编译代码,提交时,提示是UTF-8 二进制文件,提交失败

ClickHouse 失败并出现错误“DirectoryMonitor:额外信息的校验和不匹配:损坏的数据”

iOS 应用提交 - 无效的二进制文件

传输文件时出现错误导致接收失败,文件可能被其他程序占用或已经损坏

form表单提交file文件传输失败

使用健身房后,Crashlytics 在 android 上失败。 (得到“Crashlytics 已将提交二进制文件移到 Crashlytics.framework 目录之外......”错误)