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
文件,而我们从未关注过它。
现在Fabric
被FirebaseCrashlytics
替换了,为了实现这个自动机制,你可以新建一个运行脚本,然后把这个脚本粘贴到那里:
"$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 Connect
的Activity
部分找到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 FirebaseCrashlytics
和GoogleService-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)?