Подтвердить что ты не робот

Конфигурация Firebase не работает - Swift

В моем приложении я успешно использую 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)

Любые советы?

4b9b3361

Ответ 1

Я только заметил, что это начало происходить со мной, и мои сборки travis терпят неудачу с Firebase 3.16. Я понизил рейтинг до 3.7.1, который был версией, которую я ранее имел в проекте, и она снова работает.

У меня не было времени изучить его больше, но это быстро исправить. Это может быть ошибка Firebase, иначе они могут что-то изменить, и теперь настройка отличается.

Изменить: Очевидно, что переход на 3.15 работает достаточно хорошо.

Ответ 2

Начиная с Firebase 3.16.0, похоже, Google Firebase не собирает GoogleService-Info.plist из сборки unit test, даже если plist включен как в целевые приложения, так и в unit test. Это, похоже, не разрешено в 3.17.0. Как отмечали другие, понижение до 3.15.0 похоже на обострение проблемы.

Но для многих инициализация Firebase во время модульных тестов может не понадобиться и фактически непреднамеренно - например, вы, вероятно, не хотите, чтобы отчеты Firebase о сбоях unit test. В этих сценариях вы можете легко добавить защитник вокруг FIRApp.configure(), чтобы не инициализировать его при выполнении модульных тестов следующим образом:

import Foundation

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

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

Затем обязательно укажите переменную окружения TEST=1 только в вашей схеме тестирования.

Ответ 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.

Если это так, это означает, что вам, вероятно, нужно настроить конфигурацию зависимостей вашего модуля. Поскольку цель XCTest на самом деле также приводит к целевой цели хоста, она позволяет получить несколько импортов одного и того же объекта. В этом случае FIRApp инициализировал идентификатор экземпляра, но он вызывал идентификатор экземпляра для проверки с другим FIRApp, который говорил, что он не настроен. Это объясняет, почему он сбой, говоря, что он не может найти приложение, которое его инициализировало.

См. morganchen12 @answer in в Github, чтобы увидеть пример правильного подфайла.

Оригинальный ответ Ниже:

Итак, это происходит по двум причинам:

  • Firebase не может найти ваш GoogleService-Info.plist в вашем модульном тестировании хост-приложений или
  • Файл GoogleService-Info.plist либо пропускает ключ GCM_SENDER_ID, либо имеет в нем пустое значение.

Мы можем легко устранить (2) - можете ли вы проверить свой файл GoogleService-Info.plist, чтобы увидеть, имеет ли он действительный вид GCM_SENDER_ID (это будет куча чисел, например 3252652634).

Я исследую, почему GoogleService-Info.plist, по-видимому, можно найти с 3.15.x против 3.16.0 и более поздних версий.

Кроме того, как сказал @markshiz, вы, возможно, не хотите, чтобы Firebase запускался во время вашего unit test для вашего приложения. Вы можете поместить вызов FIRApp.configure() за оператор if, проверяя, работает ли приложение как unit test.

Чтобы также отладить это, вы могли бы запустить тестовое приложение с переменной окружения -FIRDebugEnabled установить? Результат этого будет очень полезен.

Ответ 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.

Ответ 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 из своего приложения, это, вероятно, связано с отсутствующей записью в GCM_SENDER_ID в файле .plist).

Есть два способа исправить:

Ружье

Просто замените весь GoogleService-Info.plist в вашем проекте только что загруженным .plist файлом из firebase, который должен содержать правильную запись для вашего приложения GCM_SENDER_ID.

One-Line из-кода

В консоли firebase откройте "Настройки" (значок шестеренки рядом с "Обзор" ), затем "Облачные сообщения". Скопируйте значение под Sender ID. В Xcode перейдите в свой GoogleService-Info.plist файл, создайте запись для GCM_SENDER_ID и вставьте значение.