【问题标题】:'FABException', reason: '[Fabric] Value of Info.plist key "Fabric" must be a NSDictionary.' when using Firebase and Crashlytics'FABException',原因:'[Fabric] Info.plist 键“Fabric”的值必须是 NSDictionary。'使用 Firebase 和 Crashlytics 时
【发布时间】:2018-10-20 19:26:23
【问题描述】:

在我们的应用中使用 Firebase 时,我遇到了一个相当特殊的场景。在不向项目添加 Crashlytics 和 Fabric 的情况下,当我为项目运行单元测试时,会遇到以下代码:

@try {
        [FIRApp configure];
} @catch (NSException *exception) {
        DLog(@"**** Unable to configure Firebase due to exception %@", exception.description);
}

在调试单元测试时不会引发异常,因此我假设 Firebase 已配置并且一切正常。测试通过,没有问题。

然后我非常简单地将带有 Fabric 的 Crashlytics 添加到项目中。我将此作为运行脚本添加到项目的构建阶段"${PODS_ROOT}/Fabric/run",然后再次运行单元测试。单元测试失败,我得到:

Terminating app due to uncaught exception 'FABException', reason: '[Fabric] Value of Info.plist key "Fabric" must be a NSDictionary.'

作为一个错误,当我运行项目时,一切都很好。该问题在运行测试时出现。我尝试了以下方法:

  1. 将 Crashlytics 和 Fabric 添加到项目目标中,我得到了同样的错误。
  2. 我执行了第 1 步以及单元测试目标,但仍然遇到相同的错误。
  3. 我执行第 2 步,然后我还将 Firebase Core 添加到单元测试目标中,但我仍然遇到相同的错误。
  4. 我执行第 3 步,然后还将 "${PODS_ROOT}/Fabric/run" 添加到运行脚本,但在单元测试目标上仍然出现相同的错误。

我认为 Firebase 未正确初始化,这反过来又导致 Fabric 未正确初始化,从而导致失败。但我不确定如何解决这个问题。任何指导和建议将不胜感激。

【问题讨论】:

  • 你不是在关注Firebase Crashlytics documentation吗? Fabric配置出错。
  • @TheTiger 他正在关注文档。我通过从测试目标中删除 pod 'Fabric' 和 'Crashlytics' 解决了这个问题。不过,我也对更好的解决方案感兴趣。
  • 你能在新创建的项目中重现这种情况吗?

标签: ios firebase crashlytics google-fabric


【解决方案1】:

我只检查一件事。 如果您在 Firebase 控制台中注册了您的应用, 你的AppDelegate.swift 文件应该在didFinishLaunchingWithOptions 函数中有Firebase.configure() 代码。

像这样。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    print("[caution] : didFinishLaunchingWithOptions")
    FirebaseApp.configure()
    Messaging.messaging().delegate = self
    Fabric.with([Crashlytics.self])
    return true
}

我遇到了同样的问题。我只是添加该代码并解决了问题。 我也希望你。

【讨论】:

  • 这里的关键是首先调用FirebaseApp.configure(),以便使用来自GoogleService-Info.plist 的信息进行配置。然后您可以安全地从Info.plist 中删除 [Fabric] 密钥。
【解决方案2】:

更改此配置:

def main_pods
    pod 'Fabric'
    pod 'Crashlytics'
    pod 'Firebase/Core'
end

target 'TargetName' do
    project 'Project.xcodeproj'
    main_pods
end

target 'OneMoreTargetName' do
    project 'Project.xcodeproj'
    main_pods
end

target 'TargetNameTests' do
    project 'Project.xcodeproj'
    main_pods
end

target 'TargetNameSwiftTests' do
    project 'Project.xcodeproj'
    main_pods
end

target 'TargetNameUITests' do
    project 'Project.xcodeproj'
    main_pods

    pod 'Utils', '~> 0.3.3'
    pod 'Pod', '~> 1.4.1'
end

到这里:

def main_pods
    pod 'Fabric'
    pod 'Crashlytics'
    pod 'Firebase/Core'
end

target 'TargetName' do
    project 'Project.xcodeproj'
    main_pods

    # Move tests inside target block
    target 'TargetNameTests' do
        inherit! :search_paths # add custom flag
    end

    target 'TargetNameSwiftTests' do
        inherit! :search_paths # add custom flag
    end

    target 'TargetNameUITests' do
        inherit! :search_paths # add custom flag

        pod 'Utils', '~> 0.3.3'
        pod 'Pod', '~> 1.4.1'
    end
end

target 'OneMoreTargetName' do
    project 'Project.xcodeproj'
    main_pods
end

【讨论】:

【解决方案3】:

我正在升级 Crashlytics,并且我已经重现了该错误。就我而言,当我删除以下代码后,问题就解决了:

//[Fabric with:@[[Crashlytics class]]];

【讨论】:

    【解决方案4】:

    错误信息非常直接。

    Info.plist 中的 Fabric 密钥格式不正确。

    它必须是字典作为其文档中的状态:

    https://fabric.io/kits/ios/crashlytics/install

    <key>Fabric</key>
        <dict>
            <key>APIKey</key>
            <string>YOUR_FABRIC_API_KEY</string>
            <key>Kits</key>
            <array>
                <dict>
                    <key>KitInfo</key>
                    <dict/>
                    <key>KitName</key>
                    <string>Crashlytics</string>
                </dict>
            </array>
        </dict>
    

    【讨论】:

    • 如果我是正确的,我不应该为 firebase 实现这样做。对于我的正常项目目标构建,我不需要这样做。那为什么我应该只为测试这样做呢?
    • 你说:然后我很简单地将 Crashlytics with Fabric 添加到项目中
    • 查看文档:firebase.google.com/docs/crashlytics/get-started 没有关于配置 plist 的内容
    • 酷.. 所以不知道你为什么要质疑。我根据错误消息为您提供了解决方案。很高兴你可以自己处理
    • 不,我已按照指南中的所有内容进行操作,但仍然无法正常工作...
    【解决方案5】:

    我有一个项目,其单元测试中的主要目标为 @testable import,当我在单元测试的 Podfile 中包含 Fabric 时,它因上述错误消息而崩溃。但是当我从Podfile 中的单元测试目标中删除Fabric 时,一切都顺利进行。

    【讨论】:

      【解决方案6】:

      Xcode 9

      对于我的情况,我在 Firebase 集成之前和创建其他非测试目标之前创建了单元测试目标。 对我有用的是,

      1. 删除单元测试目标
      2. 新建一个

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-16
        • 2019-04-03
        • 1970-01-01
        • 2019-08-16
        • 2018-12-27
        • 1970-01-01
        • 2019-03-27
        • 2018-07-30
        相关资源
        最近更新 更多