Firebase配置失败 - Swift

时间:2017-04-14 13:01:13

标签: swift xcode unit-testing firebase

在我的应用程序中,我成功使用了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)

有什么建议吗?

9 个答案:

答案 0 :(得分:16)

我刚注意到它开始发生在我身上,我的travis版本因Firebase 3.16而失败。我降级到3.7.1,这是我以前在项目中的版本,它再次运行。

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

编辑:显然回滚到3.15效果不错。

答案 1 :(得分:11)

从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=1

答案 2 :(得分:7)

可能的原因

由于您的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检查其他 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密钥或其中包含空值。
  3. 我们可以非常轻松地消除(2) - 你可以检查你的GoogleService-Info.plist文件,看看它是否有一个有效的GCM_SENDER_ID(它将是一堆数字,如3252652634)。

    我将调查3.15.x与3.16.0及更高版本中GoogleService-Info.plist显然可以找到的原因。

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

    为了帮助调试此问题,您可以运行测试应用with the environment variable -FIRDebugEnabled set吗?输出结果非常有用。

答案 3 :(得分: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

答案 4 :(得分:1)

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

pod 'Firebase', '~> 4.1.0'

答案 5 :(得分:0)

你试过这个吗?

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)

答案 6 :(得分:0)

我遇到了同样的问题,并且所提出的修复都没有帮助。

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

从帖子中提到的测试目标中删除所有firebase框架已经解决了我的问题。

答案 7 :(得分:0)

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

为我工作!

之后,它也可以在模拟器上运行。

答案 8 :(得分:-1)

我收到了同样的错误,但是来自主应用,并在搜索时遇到了这个帖子。以下答案可能不适用于单元测试,但我将其留下以防其他人在此处使用相同的错误消息但在主应用中。

如果您从应用中收到Google Sender ID must not be nil or empty,则可能是由GCM_SENDER_ID文件中.plist下的条目丢失引起的。

有两种方法可以修复:

<强>猎枪

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

<强> 1行的码

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