【问题标题】:Firebase configuration fails - SwiftFirebase 配置失败 - Swift
【发布时间】:2017-09-10 17:52:24
【问题描述】:

在我的应用程序中,我成功使用了 Firebase,在 AppDelegate 中我进行了设置:

// ### Initialize Firebase
FIRApp.configure()

现在我对相关目标进行了一些单元测试,当我启动它时出现错误:

2017-04-14 14:53:22.351 MyProject[28753] <Error> [Firebase/Core][I-COR000004] App with name __FIRAPP_DEFAULT does not exist.
2017-04-14 14:53:22.354 MyProject[28753] <Error> [Firebase/Messaging][I-IID001000] Firebase is not set up correctly. Sender ID is nil or empty.
2017-04-14 14:53:22.356 MyProject[28753] <Notice> [Firebase/Analytics][I-ACS023007] Firebase Analytics v.3800000 started
2017-04-14 14:53:22.356 MyProject[28753] <Notice> [Firebase/Analytics][I-ACS023008] To enable debug logging set the following application argument: -FIRAnalyticsDebugEnabled
2017-04-14 14:53:22.381 MyProject[28753:712475] *** Terminating app due to uncaught exception 'com.firebase.instanceid', reason: 'Could not configure Firebase InstanceID. Google Sender ID must not be nil or empty.'

版本:

Firebase/Core (3.16.0)
Firebase/Messagging (3.16.0)

有什么建议吗?

【问题讨论】:

  • 你添加脚本文件了吗?
  • 确实没有..我想不通..
  • [console.firebase.google.com/?pli=1]你注册你的应用了吗?
  • 我最近在 3.17.0 看到这个问题。您是否已将此情况报告给 Firebase 支持人员?
  • 我只在测试目标中得到了这个,我使用代码来设置 Firebase 而不是 plist,仍然遇到 Firebase 3.17.0 的问题

标签: swift xcode unit-testing firebase


【解决方案1】:

我刚刚注意到它开始发生在我身上,并且我的 travis 构建在 Firebase 3.16 上失败了。我降级到 3.7.1,这是我之前在项目中使用的版本,它又可以工作了。

我没有时间进一步研究它,但它是一个快速修复。这可能是一个 Firebase 错误,或者他们可能已经更改了某些内容并且现在设置有所不同。

编辑:显然回滚到 3.15 效果很好。

【讨论】:

  • 回滚到 pod 'Firebase/Core','3.15' 为我工作。
  • 真的吗?我试试,然后举报你!
  • 回滚到 3.15 也对我有用...将等待 3.17 并希望修复!
  • 这样做的方法是将您的 Firebase 核心更改为:pod 'Firebase/Core', '~&gt; 3.5.2',这会将您的 Firebase 版本恢复为 3.15 - 我们如何报告此错误?
【解决方案2】:

从 Firebase 3.16.0 开始,Google Firebase 似乎没有从单元测试版本中选择 GoogleService-Info.plist,即使 plist 包含在应用程序和单元测试目标中也是如此。这似乎在3.17.0 中没有得到解决。正如其他人所指出的,降级到 3.15.0 似乎可以回避这个问题。

但对于许多人来说,在单元测试期间初始化 Firebase 可能不是必需的,而且实际上是无意的——例如,您可能不希望 Firebase 报告单元测试崩溃。在这些情况下,您可以通过以下方式轻松地在 FIRApp.configure() 周围添加一个守卫,以便在运行单元测试时不对其进行初始化:

import Foundation

func isUnitTesting() -> Bool {
    return ProcessInfo.processInfo.environment["TEST"] != nil
}

if !isUnitTesting() {
    FIRApp.configure()
}

那么一定要在你的测试方案中定义环境变量TEST=1only

【讨论】:

    【解决方案3】:

    可能的原因

    这可能是由于您的 Pod 依赖项是如何设置的。您是否从 Xcode 中看到任何关于在这两个类中定义的多个实现的警告,例如:

    objc[54869]: Class FIRApp is implemented in both /Users/hli/Library/Developer/CoreSimulator/Devices/7766B001-8A5F-43B6-8860-5D36E8DC452C/data/Containers/Bundle/Application/8A18B716-D1D2-4110-83E2-9AE577A034CD/FirebaseDemo.app/FirebaseDemo (0x10d306d30) and /Users/hli/Library/Developer/Xcode/DerivedData/FirebaseDemo-ddfdueufgmkxwzameiwbuhnokgax/Build/Products/Debug-iphonesimulator/FirebaseDemo.app/PlugIns/FirebaseDemoTests.xctest/FirebaseDemoTests (0x11df8cbb0). One of the two will be used. Which one is undefined.
    

    如果是这样,这意味着您可能需要调整您的 pod 依赖项配置。由于 XCTest 目标实际上也引入了宿主应用程序的目标,因此可以获取同一对象的多个导入。在这种情况下,FIRApp 正在初始化实例 ID,但它导致实例 ID 与 other FIRApp 进行检查,这表明它没有配置。这解释了为什么它会崩溃说它找不到初始化它的应用程序。

    See morganchen12@'s answer over in Github to see an example of a correct Podfile.

    原答案如下:

    所以,发生这种情况可能有两个原因:

    1. Firebase 在您的单元测试主机应用程序包中找不到您的 GoogleService-Info.plist,或者
    2. GoogleService-Info.plist 文件缺少 GCM_SENDER_ID 键或其中包含空值。

    我们可以很容易地消除 (2) - 您能否检查您的 GoogleService-Info.plist 文件以查看它是否具有有效的外观 GCM_SENDER_ID(它将是一堆数字,例如 3252652634)。

    我将调查为什么 GoogleService-Info.plist 显然可以在 3.15.x 与 3.16.0 及更高版本中找到。

    此外,as @markshiz said,您可能实际上并不希望 Firebase 在您的应用单元测试期间启动。通过检查应用程序是否作为单元测试运行,您可以将 FIRApp.configure() 调用放在 if 语句后面。

    为了帮助调试它,您能否运行您的测试应用程序with the environment variable -FIRDebugEnabled set?这样的输出会很有帮助。

    【讨论】:

      【解决方案4】:

      我花了一段时间才找到要安装的正确版本,直到 3.17.0 发布。

      pod 'Firebase/Core', '~> 3.15.0'
      pod 'Firebase/Database', '~> 3.15.0'
      pod 'Firebase/Auth', '~> 3.15.0'
      

      保证有效。

      如果您忘记了.0 而写下3.15,它仍然会安装有故障的3.16.0

      【讨论】:

      • FWIW,我仍然可以在 3.17.0 上重现此问题。
      • 很遗憾,他们还没有在 3.17 中修复它。让我们期待 3.18。我希望他们知道这件事......
      【解决方案5】:

      将 firebase 升级到 4.1.0 解决了我的问题。也有很多警告。我建议更新 Firebase

      pod 'Firebase', '~> 4.1.0'
      

      【讨论】:

        【解决方案6】:

        你试过了吗?

        let options = FIROptions(googleAppID: String!,
                                     bundleID: String!,
                                     gcmSenderID: String!,
                                     apiKey: String!,
                                     clientID: String!,
                                     trackingID: String!,
                                     androidClientID: String!,
                                     databaseURL: String!,
                                     storageBucket: String!,
                                     deepLinkURLScheme: String!)
        FIRApp.configure(with: config)
        

        【讨论】:

          【解决方案7】:

          我遇到了同样的问题,建议的修复都没有帮助。

          我看到了本期底部提到的重复类实现警告: https://github.com/firebase/FirebaseUI-iOS/issues/271

          从那篇文章中提到的测试目标中删除所有 firebase 框架已经为我解决了这个问题。

          【讨论】:

            【解决方案8】:

            从模拟器切换到“实际 iOS 设备”

            为我工作!

            之后也在模拟器上运行。

            【讨论】:

              【解决方案9】:

              我收到了同样的错误,但来自主应用程序,并在搜索时遇到了这个线程。以下答案可能不适用于单元测试,但我将其保留,以防其他人在他们的主应用程序中出现相同的错误消息。

              如果您从您的应用程序收到Google Sender ID must not be nil or empty,这可能是由于.plist 文件中GCM_SENDER_ID 下的条目丢失造成的。

              有两种方法可以解决:

              霰弹枪

              只需将项目中的整个 GoogleService-Info.plist 替换为从 firebase 新下载的 .plist 文件,该文件应包含您应用的 GCM_SENDER_ID 的正确条目。

              单行代码

              在 firebase 控制台中转到设置(概览旁边的齿轮图标),然后转到云消息传递。复制Sender ID 下的值。在 Xcode 中转到您的 GoogleService-Info.plist 文件,为 GCM_SENDER_ID 创建一个条目并粘贴该值。

              【讨论】:

              • 如果只有 GCM_SENDER_ID 不正确,那么主应用程序也可能无法正常工作。问题(至少在我这边)是关​​于崩溃的单元测试,而应用程序工作得很好。
              • @Goodsquirrel 你说得对,我已经修改了答案。
              猜你喜欢
              • 2016-09-21
              • 2019-01-02
              • 2018-09-09
              • 1970-01-01
              • 2020-06-28
              • 2015-09-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多