iOS上如何设置Firebase Crashlytics?

48

我正在尝试将Firebase Crashlytics集成到我的iOS应用程序中,该应用程序已启用Firebase Crash Reporting功能。我遵循了这里的文档,但是当运行自定义构建阶段时,我的构建始终失败:

"${PODS_ROOT}/Fabric/run"

Xcode中的错误如下:

错误:Fabric: 配置问题

Fabric API密钥无效。您的Fabric运行脚本构建阶段应该包含您的API密钥: ./Fabric.framework/run INSERT_YOUR_API_KEY INSERT_YOUR_BUILD_SECRET

我没有Fabric API密钥,我想它们的密钥应该由Firebase库处理。 我在项目中有Info.plist文件,Firebase功能完全正常,但是我无法通过Fabric运行阶段。 任何有关如何解决此问题的帮助都将不胜感激!


错误信息很清楚,您必须获取一个API密钥。 - Claudio
3
我原本也是这个想法,但文件明确说明你不需要API密钥。我最终找到了解决方案,在Mac的Fabric.app中自动将你的Fabric API密钥设置在app-info.plist文件中,脚本会读取该文件并在未提供API密钥时失败。只需从info.plist文件中删除它,脚本就可以正常工作。 - Lucas P.
1
我忘记在AppDelegate中添加FirebaseApp.configure()。添加后,它完美地工作了。 - Mohammad Zaid Pathan
7个回答

152

终于搞清楚了,为了帮助那些遇到同样问题的人,我写下这篇文章。

如果你试过通过OSX Fabric.app安装fabric,或者以前使用Fabric Crashlytics,那么它会将Fabric API密钥添加到你的Info.plist中,而Fabric初始化构建脚本正在尝试读取它(我猜测)。

Info.plist删除Fabric密钥后,脚本就能正常工作,无需任何密钥/参数。

Firebase文档应该包含有关此问题的警告片段。


1
我遇到了完全相同的问题,我按照你的帖子并删除了API密钥。现在它可以工作了。但是,Firebase上没有记录崩溃情况。有什么想法为什么会发生这种情况吗? - Illep
1
很遗憾,它没有被记录在Firebase中。但是它显示崩溃已经上传了。<Notice>: [Firebase/Crash][I-CRA100002] Crashes uploaded successfully: ( 1e21a90b1c000000 ) - Illep
3
为了让 Firebase 仪表板上出现崩溃日志,我需要将 Fabric 与 Crashlytics 解绑,并按照以上步骤操作。这个问题似乎只在 iOS 上存在。 - atodTechies
3
嘭!这对我有用!只是在试图清理我的项目,准备迎接2019年的全面转型。 - Christian Gossain
3
大家好,我正在将一款iOS应用从Fabric迁移到Firebase,并遇到了类似的问题。我的问题是:“我们需要删除 AppDelegate 中的 Fabric 初始化和 Info.plist 中的 Fabric Key 吗?”如果我们删除它们,那么 Firebase 就无法获得崩溃日志。如果我们不删除它们,那么为什么还需要将应用链接到 Firebase 呢?我的意思是,通过将应用与 Firebase 链接,我们将获得所有崩溃日志。 - NightWatcher
显示剩余5条评论

5

如果你紧密地遵循了 入门文档,那么可能会遇到一些挫折。相信我,我也经历过这样的事情。

现在,我可以与你分享以下内容:

  1. 如果你之前有针对该目标的 Fabric RunScript,则最好将其删除并创建一个新的,在其中应用 GettingStarted 指令,并将 $(INFOPLIST_PATH) 替换为 GoogleService-Info.plist

  2. 你的 Info.plist 文件中不应该再有 Fabric 配置了。这个东西是: <key>Fabric</key><dict>...</dict>。如果你仍然有这个配置,请告别它并放弃那些感觉,否则就会面临此问题

  3. 如果你在 Xcode 控制台中看到这个东西:[Fabric] failed to download settings Error Domain=FABNetworkError Code=-5... blah blah blah,那么先清理 Build 文件夹(shift + cmd + k)。

如果你的下一个构建工作正常,尝试强制使应用程序崩溃并在 Firebase 上查看崩溃日志。

以下是我的配置:Xcode 10.2.1 | Fabric 1.9 | Crashlytics 3.12


使用GoogleService-Info.plist替换$(INFOPLIST_PATH)可以解决这个问题。 - Raiss
我曾坚信这应该行得通,但实际上并没有。 - ytpm

3
我的问题在于我之前使用的是旧版 Fabric,所以我需要从 info.plist 文件中删除密钥。

2
我按照文档https://fabric.io/kits/ios/crashlytics/install的说明添加了运行脚本并更新了Info.plist,但仍然遇到了以上问题。
显然,我意外地添加了两次“New Run Script Phase”。在删除不必要的“Run Script”后,项目成功编译。
Xcode 10.1 Fabric 1.7.5 Crashlytics 3.10.4

2

文档

  • 如果在您的项目中已经设置了Crashlytics(迁移情况下),

    1. 从Info.plist中删除Fabric密钥(需要删除字典和Fabric密钥)
    2. 按照文档操作。(只需在构建阶段的运行脚本中使用"${PODS_ROOT}/Fabric/run",而不是"${PODS_ROOT}/Fabric/run" key1 key2
  • 如果您的项目中尚未设置Crashlytics(开始与Firebase Crashlytics集成),请按照文档操作。


0
如果您正在使用Crashlytics,您可能需要进入Build Phases -> Crashlytics configuration并将其添加到shell/bin/sh部分,如下所示:`set -e

if [[ ${PODS_ROOT} ]]; then echo "info: Exec Fabric Run from Pods" "${PODS_ROOT}/Fabric/run" YOUR KEY HERE else echo "info: Exec Fabric Run from framework" "${PROJECT_DIR}/Fabric.framework/run" YOUR KEY HERE fi`


0

备用脚本

  1. 进入“Build Phases”
  2. 在+ ->“New Run Script Phase”中创建一个新的脚本
  3. 确保它始终是最后一个
  4. 复制并粘贴此脚本
set -e

echo "info: Exec Upload dSYM"
#Path for google service .plist 
GOOGLE_SERVICE_INFO_PLIST="${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}/GoogleService-Info.plist"
#Path for DSYM directory
DSYM_PATH="$DWARF_DSYM_FOLDER_PATH/dddd/$DWARF_DSYM_FILE_NAME"
#Firebase command script
CMD=""
if [[ ${PODS_ROOT} ]]; then
  echo "info: Exec FirebaseCrashlytics Run from Pods"
  CMD="$PODS_ROOT/FirebaseCrashlytics/upload-symbols"
else
  echo "info: Exec FirebaseCrashlytics Run from framework"
  CMD="$PROJECT_DIR/FirebaseCrashlytics.framework/upload-symbols"
fi

echo "info: Checking if .plist exists"
if [ -f "$GOOGLE_SERVICE_INFO_PLIST" ]; then
    echo "info: $GOOGLE_SERVICE_INFO_PLIST exists."
else 
    echo "ERROR: $GOOGLE_SERVICE_INFO_PLIST does not exist."
    exit 1
fi

echo "info: Checking if .dSYM"
if [ -d "$DSYM_PATH" ]; then
    echo "info: $DSYM_PATH exists."
else 
    echo "ERROR: $DSYM_PATH does not exist."
    echo "info: try fallback"
    DSYM_PATH=` find "${DWARF_DSYM_FOLDER_PATH}" -name "*.dSYM" | xargs `
    if [ -d "$DSYM_PATH" ]; then
        echo "info: $DSYM_PATH exists."
    else 
        echo "ERROR: $DSYM_PATH does not exist."
        exit 1
    fi
fi
echo "info: Check if upload-symbols script exists"
if [ -f "$CMD" ]; then
    echo "$CMD exists."
else 
    echo "ERROR: $CMD does not exist."
    exit 1
fi

echo "info: Starting command upload-symbols"
"${CMD}" -gsp "$GOOGLE_SERVICE_INFO_PLIST" -p ios "$DSYM_PATH" > /dev/null 2>&1 &
echo "info: Symbol uploading will proceed in the background."
echo "info: remove '> /dev/null 2>&1 &' to test in the main thread and see if there are any errors, or open console and filter with 'upload-symbols'"


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