繁体   English   中英

'FABException',原因:'[Fabric] Info.plist 键“Fabric”的值必须是 NSDictionary。' 使用 Firebase 和 Crashlytics 时

[英]'FABException', reason: '[Fabric] Value of Info.plist key “Fabric” must be a NSDictionary.' when using Firebase and Crashlytics

在我们的应用程序中使用 Firebase 时,我有一个相当奇特的场景。 在没有向项目添加 Crashlytics 和 Fabric 的情况下,当我为项目运行单元测试时,会命中以下代码:

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

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

然后我非常简单地将 Crashlytics with Fabric 添加到项目中。 我将此作为运行脚本添加到项目的构建阶段"${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 控制台中注册了您的应用,则您的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
}

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

更改此配置:

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

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

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

错误消息非常直接。

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>

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

Xcode 9

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM