iOS 和 FirebaseCrashlytics

Posted

技术标签:

【中文标题】iOS 和 FirebaseCrashlytics【英文标题】:iOS and FirebaseCrashlytics 【发布时间】:2020-07-04 08:52:58 【问题描述】:

我正在尝试按照Firebase Docs 上的说明上传缺少的所需 dSYM。但是我一直在运行上传脚本。

在我的构建阶段,我有

"$PODS_ROOT/FirebaseCrashlytics/upload-symbols -gsp$SRCROOT/GoogleService-Info.plist -p ios $SRCROOT/appDsyms"

当我尝试使用它构建 iOS 应用程序时,我收到错误:

第 4 行:/path/to/Pods/FirebaseCrashlytics/upload-symbols -gsp/path/to/GoogleService-Info.plist -p ios /path/to/appDsyms:没有这样的文件或目录强>

命令 PhaseScriptExecution 失败,退出代码非零

当我尝试从终端运行脚本时出现错误:

未提供 Google 应用 ID 或 Google 服务文件

我已验证我有一个 Google 服务文件,并且能够使用其他依赖它的 firebase 服务来运行我的项目。我以前可以将 Dysm 文件直接上传到 Firebase 控制台,但在 3 月 1 日发生了变化。

这个命令应该作为 XCode 脚本运行还是作为来自终端的命令运行?而且,更重要的是,有人知道如何解决这个问题吗?

【问题讨论】:

【参考方案1】:

我们可以做到:

PATH_TO_GOOGLE_PLISTS="$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.app/GoogleService-Info.plist"

获取对 plist 的引用

然后使用它:

"$PODS_ROOT/FirebaseCrashlytics/upload-symbols" -gsp "$PATH_TO_GOOGLE_PLISTS" -p ios "$DWARF_DSYM_FOLDER_PATH/$DWARF_DSYM_FILE_NAME"

【讨论】:

【参考方案2】:

相信我,我花了一天时间但没有任何效果,

令人惊讶的是,很少有解决方案适用于我的同事的几个项目,但我使用的是 Big Sur 和 Xcode 12.2,但对我没有任何帮助。

尝试 1:firebase 文档中提到的每个步骤。

尝试2:尝试通过传递path_to_pod_firebasecrshlytics/uploadsybol -gsp path_to/GoogleService-Info.plist -p ios path_to/dSYMs从终端上传符号

但是,运气不好,

以下技巧对我有用,

第 1 步:确保您使用的是最新的 firebase crashlytics 版本,提供项目路径并触发 cmd pod update

我使用的是 Firebase Crashlytics 版本 4.0.0-beta.1,但在 pod 更新后它是 8.2.0

第 2 步:进入构建阶段,在下面添加运行脚本编译捆绑资源"$PODS_ROOT/FirebaseCrashlytics/run"

第 3 步:添加 DYSM 脚本,"$PODS_ROOT/FirebaseCrashlytics/upload-symbols" -gsp "$PROJECT_DIR/your_path/GoogleService-Info.plist" -p ios "$DWARF_DSYM_FOLDER_PATH/$DWARF_DSYM_FILE_NAME"

第 4 步:构建项目;

第 5 步:运行项目并停止或断开与故事板的连接

第 6 步:使崩溃 2-3 次并等待 2-5 分钟。

干杯,一切准备就绪!

【讨论】:

大家观察"$PROJECT_DIR/your_path/GoogleService-Info.plist" -p ios中的your path 运行命令有什么作用?我的构建中有它,但在文档中找不到它【参考方案3】:

检查您的完整项目文件夹路径是否包含空间。我通过将我的项目移动到另一个没有空间的文件夹路径来解决它。

【讨论】:

【参考方案4】:

截至 2020 年 5 月:

Fabrics 关闭后,许多开发人员都面临这样的问题,因为 Fabric 会自动创建脚本以从 Xcode 上传 dSYM 文件,而我们从未关注过它。

现在FabricFirebaseCrashlytics替换了,为了实现这个自动机制,你可以新建一个运行脚本,然后把这个脚本粘贴到那里:

"$PODS_ROOT/FirebaseCrashlytics/upload-symbols" -gsp "$PROJECT_DIR/GoogleService-Info.plist" -p ios "$DWARF_DSYM_FOLDER_PATH/$DWARF_DSYM_FILE_NAME"

此脚本将获取 dSYM 文件并将它们上传到 firebase 服务器,以便您查看崩溃情况。

对于多个方案:

如果您的项目有多个方案,您可以通过更改 Google Plist 文件的路径来简单地创建多个此类脚本。

注意:您也可以使用upload-symbols tool [Check here] 手动上传dSYM 文件,但最好尽可能自动化该过程。

编辑:2020 年 7 月: 当您在Crashlytics 仪表板中看到丢失的崩溃 dSYM 文件时,您可以在提交构建文件后立即上传 dSYM 文件以供 Apple 审查或通过 Test Flight 进行测试.

显示缺少dSYM 是因为启用bitCode 时,App Store Connect 会处理上传它的二进制帖子并生成一个新的 dSYM 文件。

您可以在App Store ConnectActivity 部分找到dSYM 文件。

【讨论】:

感谢您的贡献!如何获取 dwarf DSYM 文件夹路径和文件名? @mobiledevcookie 您只需按原样编写脚本。您无需指定确切的路径。脚本会自己找到它。唯一需要您注意的是:"$PROJECT_DIR/GoogleService-Info.plist"。确保您指明了 GoogleService-Info.plist 文件的正确路径。无论如何,如果出现任何问题,Firebase 现在会提供一条描述性很强的错误消息,并且很容易解决此问题。 我收到一个错误:在构建阶段模式下运行上传符号正在验证 Crashlytics 的构建环境... 验证成功。由于上传符号在验证模式下运行而退出正在获取上传符号设置... [31merror:无法获取上传符号设置:无法连接到服务器。[0m 命令 PhaseScriptExecution 失败,退出代码为非零 脚本有效。 dSYM 符号已上传,但崩溃仍未在 Firebase 中解密。 @mobiledevcookie 请检查您是否拥有使用 GoogleService-Info.plist 的正确权限。检查您的 Firebase 项目设置。【参考方案5】:

经过几个小时的努力,这个问题终于用这种方法解决了:

在终端中使用这个命令:/path/to/pods/directory/FirebaseCrashlytics/upload-symbols -gsp /path/to/GoogleService-Info.plist -p ios /path/to/dSYMs

重要的是,您应该在应用程序文件夹中输入 pods 文件夹的路径而不是 /path/to/pods/directory,而不是 /path/to,您应该输入项目文件夹中的 GoogleService-Info.plist 的路径.最后一个是,而不是/path/to/dSYMs,您应该输入格式为.xcarchive 的存档路径。

要找到.xcarchive 路径,您应该首先归档您的应用程序,然后转到 XCode -> Organizer 并选择您的构建,然后右键单击它并选择“在查找器中显示”,然后右键单击您的 @987654328 @ 文件并选择“显示包内容”。就是这样,您可以复制此路径并粘贴它而不是 /path/to/dSYMs,然后按 Enter 开始上传到 Firebase Crashlytics。

查看此链接了解更多信息: Firebase Docs

【讨论】:

我已经尝试过这个解决方案,但在 firebase crashlytics 控制台中仍然显示相同(必需的 dsym 文件)。你能帮帮我吗? 存档后是否需要上传每个 dSYM 文件? @MaheshNFC 是的。有什么问题? 每次发布​​时手动上传调试信息,并希望它与编译后的代码匹配?你看不出这有什么问题吗?哇。 @AndrewKoster 您也可以随时使用其他方法!【参考方案6】:

就我而言,在我添加以下内容之前都没有工作:

"$PODS_ROOT/FirebaseCrashlytics/run" -gsp "$PROJECT_DIR/intermediate_folders/GoogleService-Info.plist"

"$PODS_ROOT/FirebaseCrashlytics/upload-symbols" -gsp "$PROJECT_DIR/intermediate_folders/GoogleService-Info.plist" -p ios  "$DWARF_DSYM_FOLDER_PATH/$DWARF_DSYM_FILE_NAME"

如果我没有将路径添加到运行命令,构建阶段将永远运行......

【讨论】:

【参考方案7】:

在为 Crashlytics 实施 FirebaseCrashlytics(目前处于测试阶段)时

Build Phases 添加新的运行脚本并添加以下内容:

"$PODS_ROOT/FirebaseCrashlytics/run"

Input Files部分添加

$DWARF_DSYM_FOLDER_PATH/$DWARF_DSYM_FILE_NAME/Contents/Resources/DWARF/$TARGET_NAME

$(SRCROOT)/path to/GoogleService-Info.plist

如果您仍然收到dSYM 丢失错误,请尝试从终端运行

/path/to/pods/FirebaseCrashlytics/upload-symbols -gsp /path/to/GoogleService-Info.plist -p ios /path/to/dSYMs

对于path to FirebaseCrashlyticsGoogleService-Info.plist从实际位置拖放 对于 dSYM 路径将是 $DWARF_DSYM_FOLDER_PATH/$DWARF_DSYM_FILE_NAME

要使用您的项目 .xcodeproj 和目标 xcodebuild -project YourProject.xcodeproj -target YourTarget -showBuildSettings 来获得该命令 并替换您的特定路径

在实施 Crashlytics 时请注意以下事项 1. 以发布模式运行应用程序 2. 测试与 mac 断开设备时 3.设置正确GoogleService-Info.plist 4. 如果重命名,请确保在需要时设置正确的文件名。

【讨论】:

为什么说需要Run application in release mode?您也可以为Debug 模式启用DWARF with dSYM @Starsky Crashlytics 记录崩溃处于发布模式,这就是原因。【参考方案8】:

嗯,没有什么对我有用,但改变了这个:

"$PODS_ROOT/FirebaseCrashlytics/run" 

到这里:

"$PODS_ROOT/FirebaseCrashlytics/run" -gsp "$PROJECT_DIR/project_main_dir/google-services-files/iOS-GoogleService-Info.plist" 

编辑

对于那些试图遵守 iOS 催化剂的人:

您不必下载两个不同的 Google JSON 文件。您应该只使用一个(因为您只有 1 个目标)。如果您想上传您的应用程序的 mac 版本,只需转到 App Store Connect 并为 OSX 创建一个新版本(在您应用程序的同一页面中)

【讨论】:

在这之后我们需要在终端上运行任何代码吗?还是这个就够了? 这个对我来说已经足够了 在我的情况下,它仍然显示 dSYM 文件丢失。说要在 crashlytics 控制台中上传它们。【参考方案9】:

2020 FirebaseCrashlytics 解决方案

你有两个解决方案:

1) 从命令行

转到您的项目文件夹并运行:

./Pods/FirebaseCrashlytics/upload-symbols -gsp GoogleService-Info.plist -p ios <path_to_your_dsyms_zip>

您可以在 Xcode 管理器中获取您的 dsym > 右键单击​​存档 > 在 Finder 中显示 -> 显示内容 -> 转到 dsymm 文件夹并压缩它

2) 从 Xcode 构建阶段

如here (Firebase doc) 所述,您可以使用此内容在 Xcode 中添加运行脚本阶段:

"$PODS_ROOT/FirebaseCrashlytics/run"

您还必须在运行脚本下添加这两个输入文件:

$DWARF_DSYM_FOLDER_PATH/$DWARF_DSYM_FILE_NAME/Contents/Resources/DWARF/$TARGET_NAME

$(SRCROOT)/$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)

【讨论】:

此解决方案是唯一对我有用的解决方案 - 如上所示省略了 GoogleService-Info.plist 文件的路径使其工作。 谢谢,这行得通....确保使用 dSYM 文件将设置调试信息格式设置为 DWARF。否则我认为不会上传 dsym 我应该用值替换 $DWARF_DSYM_FOLDER_PATH、$DWARF_DSYM_FILE_NAME 或 $TARGET_NAME 吗?还是 Xcode 知道如何使用这些键? @AsiGivati 你不需要改变任何东西 谢谢!在我的情况下,添加了$(SRCROOT)/$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH) 对于矮人:firebase.google.com/docs/crashlytics/…【参考方案10】:

最后,我想通了并写了一个shell 脚本来为我处理这一切

随意使用:https://github.com/cs4alhaider/firebase-upload-symbols

【讨论】:

太好了,您能告诉我如何在 macbook 中运行该 shell 脚本【参考方案11】:

您的 Google 服务路径似乎已关闭。这是我的构建阶段的示例,它能够成功上传 dSYM。我建议再按照这些说明操作一次https://firebase.google.com/docs/crashlytics/get-deobfuscated-reports-new-sdk?platform=ios&authuser=0。

找到 /Users/okodysh/Library/Developer/Xcode/DerivedData/myApp-ftqksfkpdvisbtaozpqzzjiizpfk/Build/Products/Debug-iphonesimulator -name "myApp.app.dSYM" | xargs -I $PODS_ROOT/FirebaseCrashlytics/upload-symbols -gsp /Users/okodysh/Desktop/iOSApps/myApp/myApp/GoogleService-Info.plist -p ios

【讨论】:

【参考方案12】:

"$PODS_ROOT/FirebaseCrashlytics/upload-symbols" -gsp "$PROJECT_DIR/additional_folder/GoogleService-Info.plist" -p ios "$DWARF_DSYM_FOLDER_PATH/$DWARF_DSYM_FILE_NAME"

我在其他文件夹中替换了我的 GoogleService-Info.plist,并在 shell 脚本中进行了目录更改。或许你也应该这样做

对于终端命令,您最好在终端中拖放必要的文件,然后复制选定的路径

/path_to_pods/FirebaseCrashlytics/upload-symbols -gsp /path_to_google_service/GoogleService-Info.plist -p iOS /path_to_dSYMs

【讨论】:

以上是关于iOS 和 FirebaseCrashlytics的主要内容,如果未能解决你的问题,请参考以下文章

如何在 FirebaseCrashlytics iOS 最新升级中强制崩溃?

iOS 应用程序中的 Firebase Crashlytics 无法正常工作

从 Fabric 迁移到 FirebaseCrashlytics 后测试失败

在 iOS 应用中升级 SDK 后 Firebase Crashlytics 不显示日志

如何使 Android 和 iOS 的 Flutter App 崩溃(以测试 Firebase Crashlytics)?

Firebase Analytics / Firebase Crashlytics - 报告错误