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

use*_*610 21 ios firebase crashlytics google-fabric

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

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

在调试单元测试时,不会引发异常,因此我假设已配置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.'
Run Code Online (Sandbox Code Playgroud)

作为一个错误,当我运行项目,但一切都很好.只有在运行测试时才会出现此问题.我尝试过以下方法:

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

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

小智 9

我只是检查一件事。如果您在Firebase控制台中注册了应用程序,则AppDelegate.swift文件应具有功能Firebase.configure()代码didFinishLaunchingWithOptions

像这样。

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

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


Dmi*_*rov 5

更改此配置:

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
Run Code Online (Sandbox Code Playgroud)

对此:

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
Run Code Online (Sandbox Code Playgroud)


GIJ*_*JOW 1

错误消息非常简单。

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>
Run Code Online (Sandbox Code Playgroud)

  • 如果我是正确的,我不需要为 firebase 实现执行此操作。我不需要为我的正常项目目标构建执行此操作。那么为什么我应该只为了测试而这样做呢? (4认同)
  • 不,我已按照指南中的所有内容进行操作,但仍然无法正常工作... (2认同)