成功提交我的应用后出现“符号文件过多”的问题

205

我下载了 Xcode 6 GM 并今天将两个 Swift 应用程序提交到应用商店。 它们都通过了所有预上传验证和其他必须通过的内容,并成功提交。 但是,之后我收到了来自苹果的两封电子邮件...每个程序一封,它们都说:

亲爱的开发者,

我们发现您最近提交的“xxxxxxxx”(我的应用程序名称已删除)的交付中存在一个或多个问题。 您的交付成功,但您可能希望在下次交付时纠正以下问题:

符号文件过多 - 这些符号在任何二进制文件中都没有对应的切片[1431D977-72BC-308F-AB71-71529F25400B.symbols, 158C72A7-98AC-3F07-B2BE-88427591B413.symbols, 44973EAC-563E-340C-B549-55A5014A68BA.symbols, 678BF06F-0C3D-3A09-BFBF-699C7079FECD.symbols, 90907DDB-0400-38ED-BB5F-0C12333C0624.symbols, 93B79949-5757-374A-97B9-825AE1A61B7D.symbols, ABA05220-4FB0-397F-AFBB-08774A82F4CA.symbols, AD70F02A-4422-32B8-8C40-CF9B45A2CCC6.symbols, B0CC9F7D-C542-3E18-A518-B28B7ECABE80.symbols, BF6A4C3B-6FA5-3C51-8404-19C2F132458D.symbols, C9D6E078-8E2A-39D9-8DEE-476916A69CEE.symbols, CF5320DF-AB31-3845-BAD5-F6E51045D396.symbols, D4967AA3-8FB0-3712-B0DE-7F4144AF8F4B.symbols, D813B314-AD37-31D4-B675-442052994495.symbols, DF42A13F-08D8-3E71-B221-FC357E0B60F5.symbols, F5F636C2-F0E0-3CA7-8F7D-C49A36CD5C65.symbols]

修复问题后,您可以使用Xcode或Application Loader将新的二进制文件上传到iTunes Connect。

敬礼,

App Store团队

我猜这与我或我的应用程序无关,只是第一天提交Swift应用程序的怪癖?这两个应用程序仍处于“等待批准”模式。我当然想不出任何改变可以消除他们说的话!还有其他人提交Swift应用程序并获得了那种回应吗?我应该忽略它并等待看看会发生什么吗?

我的提示信息是 Invalid Swift Support,你知道我为什么会收到这个提示吗?我正在使用最新版本的 Xcode。 - Dehli
这里也有同样的问题,我的应用程序因为这个问题无法提交审核。有人解决了吗? - yudun1989
1
同样的问题在这里。无论如何已提交审核..让我们看看会发生什么 :) - dandoen
我的两个Swift应用刚刚被App Store批准了...所以我瞎担心了!呼... :) - Jim Barber
10个回答

134

如果您在项目归档中包含库的调试信息,但未包含二进制文件,则会发生这种情况。

  1. 在Xcode中打开组织者窗口
  2. 右键单击出现此问题的存档,并选择“在Finder中显示”
  3. 右键单击存档文件,选择“显示包内容”
  4. 在“dSYMs”文件夹中,您将看到几个文件。 如果您对这些文件运行dwarfdump控制台命令,则会获得UUID字符串列表:

dwarfdump -u MyFile.dSYM

我相信你能从苹果的邮件中找到一些匹配的UUID。

为了避免这个警告,你只需要将应用程序的dSYM文件包含在存档中,而不是库文件。要做到这一点,需要更改库文件的构建配置以使其不生成dSYM文件。只需在配置中搜索“调试信息格式”,并将其从DWARF with dSYM File更改为仅DWARF即可。

例如,在下面的屏幕截图中,你将找到Stripe iOS框架。

Xcode项目设置截图


15
在文件夹中输入“dwarfdump -u *”以查看所有UUID。 - Jon
@Jon 噢,为什么我一个一个地做完后才看到它呢?:) 不管怎样,谢谢! - Serj Rubens
7
删除 dSYM 文件是否意味着与第三方相关的任何崩溃都无法在 Crashlytics(或任何其他崩溃报告工具)上进行符号化? - Eugenio
如果您使用Firebase或Fabric,那么dSYM文件应该用于在网站上查看崩溃日志。这个变化后它们还能用吗? - matti157

93
如果您在使用CocoaPods时遇到此问题,请将以下内容添加到您的Podfile中:
post_install do |installer|
    installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings['DEBUG_INFORMATION_FORMAT'] = 'dwarf'
        end
    end
end

它将仅为所有Pod目标设置调试信息格式为DWARF(而不是主应用程序目标)


@wzbozon 是的,我只是想再确认一下。因为在我这样做之后,Crashlytics 就停止工作了。谢谢! - Cesar Rodriguez
Crashlytics应该会继续为您的应用程序工作,因为此脚本仅更改pods的构建设置。 - Stan
1
我同意。但是你不会看到有关 pods 的报告。例如,可以仅为某些 pods(例如开发 pods)设置带有 dSYM 文件的 DWARF。 - Denis Kutlubaev
@Stan,你是在说Crashlytics会继续工作吗?Cesar Rodriguez似乎在说它不会工作。 - airowe
9
这对我解决了问题。别忘了运行pod install - firebear
上传包后,我的电脑没有出现任何问题。 - wzso

20

如果您正在使用CocoaPods,并且您的应用程序只设置为仅使用arm64(即在项目的info.plist中只有arm64)

<key>UIRequiredDeviceCapabilities</key>
<array>
    <string>arm64</string>
</array>

那么您可以尝试在Podfile中添加以下脚本以解决此问题。

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['ENABLE_BITCODE'] = 'NO'
      config.build_settings['ARCHS'] = 'arm64'
    end
  end
end

并且

将所有项目的目标(不包括Pods中的目标)设置为仅限于arm64

Xcode项目设置

CocoaPods Github问题参考


现在您应该也要包括 arm64e,对吧? - shim
我会为模拟器包含arm64s。它将在发布版本中自动删除。 - cybergen

14

由于该项目具有有效的架构arm64,而CocoaPods目标具有有效的架构arm64、armv7和armv7s,因此我遇到了这个问题。

要检查哪个目标具有哪种有效的架构,请按照以下步骤进行:

  1. 在Xcode -> 窗口 -> 组织者中打开
  2. 选择档案并在Finder中显示
  3. .xcarchive文件上,显示包内容
  4. 打开Terminal并提供dSYMs文件夹的路径。

  5. 输入命令dwarfdump --uuid *,它将显示具有有效架构的UUID列表。

UUID将与苹果的警告电子邮件匹配。

主项目和Cocoa Pods目标应该具有相同的有效架构。通过这样做,它将解决这个问题。


1
我认为这是最好解释正在发生的事情。我只有关于具有armv7架构的库的警告,因为我的项目仅构建为arm64。问题仍然存在,即我是否应该将armv7添加到项目中或从Pods中删除它。 - Ariel Bogdziewicz

7

通过启用位代码,对我来说起了很大的作用 - 此前它是关闭状态

启用位代码- 是的

输入图像描述


1

以上内容有助于故障排除,但无法解决。我们的项目是在iOS 12上进行的,但使用的pods版本是10,导致了一堆armv7文件。将pod更新到iOS 12即可立即解决问题。


0

我曾经遇到过同样的问题,通过确保所有目标的“常规” => “部署信息” => “部署目标”相同来解决它。


0
在Xcode中,查找“Strip Debug Symbols During Copy”(COPY_PHASE_STRIP)选项,该选项可以使调试符号从您的.app文件中省略,并放置到.dSYM文件中。否则,您的.app文件将包含这些符号。(默认情况下,出于混淆的原因,调试符号会从发布版本中剥离。您可能不应更改此设置以进行发布配置。)
请确保在项目构建设置中检查此选项。

https://possiblemobile.com/2015/03/symbolicating-your-ios-crash-reports/


0
我的问题出在 build.xcconfig 文件的一行上。我必须将其删除。
IPHONEOS_DEPLOYMENT_TARGET = 11.0

这个问题与编程有关,原因是项目只设置为 arm64 架构(而不是 arm7)。按照 @miOS 的步骤,我发现 pods 项目正在同时构建两种架构。


1
iOS 11不再支持armv7和armv7s,因此如果您的部署目标>= iOS 11.0,则只需要arm64。 - Ariel Bogdziewicz

-3

对我来说,一切都非常简单。我遇到了同样的问题,一周不知道该怎么办。

在提交存档应用程序后,您将在小弹出窗口中看到分发证书。 在其后面有一个复选框,您应该取消选中它。之后,您将提交它并收到有关符号文件的电子邮件。但这不是问题。 它只是一个警告而不是错误! 如果您取消选中该复选框,则应用程序将被正确发送。我希望这可以帮到你。

复选框和弹出窗口的截图:

Screenshot of the checkbox and the popup


我真的希望你能更详细一些... 我不知道你在说什么复选框或弹出窗口。也许可以提供屏幕截图吗? - Louis Hong
我想我看到了,就是这个。 - Louis Hong
6
可以,但这将从包中删除所有符号,因此您将无法收到含符号的崩溃报告?(现在App Store应用程序中使用TestFlight仍然提供含符号的崩溃报告吗?) - Markus Rautopuro
31
这不是解决问题的有效方案。这只是回避了症状,没有解决问题的根本。请参考Mikhail的答案,了解您上传不需要的符号的描述。此答案会防止上传 任何 符号,从而破坏通过iTunesConnect进行崩溃符号化的功能。 - JConway
3
如果你这样做,就无法在App Store上分析你的应用程序崩溃错误。不要这样做。 - user924

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接