Ios ';FABException';,原因:';[Fabric]Info.plist key的值;“织物”;必须是一本NSD字典;使用Firebase和Crashlytics时

Ios ';FABException';,原因:';[Fabric]Info.plist key的值;“织物”;必须是一本NSD字典;使用Firebase和Crashlytics时,ios,firebase,crashlytics,google-fabric,Ios,Firebase,Crashlytics,Google Fabric,在我们的应用程序中使用Firebase时,我有一个非常奇怪的场景。在不向项目中添加Crashlytics和Fabric的情况下,当我为项目运行单元测试时,会遇到以下代码: @try { [FIRApp configure]; } @catch (NSException *exception) { DLog(@"**** Unable to configure Firebase due to exception %@", exception.description)

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

@try {
        [FIRApp configure];
} @catch (NSException *exception) {
        DLog(@"**** Unable to configure Firebase due to exception %@", exception.description);
}
调试单元测试时,不会引发异常,因此我假设firebase已配置,并且所有功能都正常工作。测试通过,没有问题

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

Terminating app due to uncaught exception 'FABException', reason: '[Fabric] Value of Info.plist key "Fabric" must be a NSDictionary.'
作为一个错误,当我运行项目,但一切都很好。只有在运行测试时才会出现问题。我尝试了以下方法:

  • 将Crashlytics和Fabric添加到项目目标,我会得到相同的错误
  • 我执行了步骤1,也执行了单元测试目标,但仍然得到相同的错误
  • 我执行了第2步,然后我还将Firebase Core添加到单元测试目标,但仍然得到相同的错误
  • 我执行步骤3,然后还将${PODS\u ROOT}/Fabric/run“添加到一个运行脚本中,但是在单元测试目标上,仍然会得到相同的错误

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

    错误信息非常直接

    Info.plist中的结构密钥格式不正确

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

    结构
    阿皮基
    您的\u织物\u API\u密钥
    套件
    KitInfo
    KitName
    粗制滥造
    
    我只检查一件事。 如果您在Firebase控制台中注册了应用程序, 您的
    AppDelegate.swift
    文件应具有
    Firebase.configure()
    code中的
    didfishlaunchwithoptions
    功能

    像这样

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        print("[caution] : didFinishLaunchingWithOptions")
        FirebaseApp.configure()
        Messaging.messaging().delegate = self
        Fabric.with([Crashlytics.self])
        return true
    }
    
    我也遇到了同样的问题。我只是添加了代码,问题就解决了。
    我也祝你好运。

    Xcode 9

    在我的例子中,我在firebase集成和创建其他非测试目标之前创建了单元测试目标。 对我有用的是

  • 删除单元测试目标
  • 创建一个新的

  • 更改此配置:

    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]]];
    

    我有一个项目,在单元测试中有一个主目标的
    @testable import
    ,当我在单元测试的pod文件中包含
    Fabric
    时,它崩溃了,出现了前面提到的错误消息。但是,当我从
    pod文件中的单元测试目标中删除
    Fabric
    时,一切都顺利进行。

    如果我是正确的,我不需要为firebase实现执行此操作。对于我的正常项目目标构建,我不需要这样做。那么为什么我要只为测试而这样做呢?你说:我只是简单地将Crashlytics with Fabric添加到项目中。参见文档:没有关于配置plistcool的内容。。所以我不知道你为什么质疑。我根据错误消息为您提供了解决方案。很高兴你能自己处理。不,我已经按照指南中的所有内容进行了操作,但它仍然不起作用。你不是在按照指南进行操作吗?配置结构时出错。@正在按照文档进行操作的工程师。我通过从测试目标上移除吊舱“织物”和“碰撞”来解决这个问题。不过,我也对更好的解决方案感兴趣。你能在新创建的项目中重新创建这种情况吗?链接到
    inherit!:搜索路径
    说明此处的关键是首先调用
    FirebaseApp.configure()
    ,以便使用来自
    GoogleService info.plist的信息对其进行配置。然后您可以安全地从
    Info.plist
    中删除[Fabric]键。
    //[Fabric with:@[[Crashlytics class]]];