Используйте другой GoogleService-Info.plist для одного проекта в xcode, используя swift4 - PullRequest
2 голосов
/ 17 июня 2019

У меня есть один проект, но с 4 различными средами (Dev, Stagging, QA, Production).Я дал их (URL-адрес веб-службы среды) из настроек мобильного телефона.Теперь я хочу использовать разные GoogleService-info.plist для всех этих разных сред.Например, когда я выбираю Dev из серверной части, проект должен брать только GoogleService-Info.plist из проекта Dev.Эти списки GoogleService-Info.plists созданы на 4 разных аккаунтах.Проект должен пройти путь GoogleService-info.plist программно.Я попробовал следующий код

1] Используя ссылку из этого url, я создал две папки Dev и QA (на данный момент) и попытался указать их пути программно

#if DEV
    print("[FIREBASE] Development mode.")
    filePath = Bundle.main.path(forResource: "GoogleService-Info", 
ofType: "plist", inDirectory: "Dev")
    #elseif QA
    print("[FIREBASE] QA mode.")
    filePath = Bundle.main.path(forResource: "GoogleService-Info", 
ofType: "plist", inDirectory: "QA")
    #endif
    let options = FirebaseOptions.init(contentsOfFile: filePath)!
    FirebaseApp.configure(options: options)

Но выдает ошибку

Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value

на

 let options = FirebaseOptions.init(contentsOfFile: filePath)!

этой строке

2] Во-вторых, я изменил имя GoogleService-Info.plistот GoogleService-Info-QA.plist и пытался получить доступ к этому файлу программно

private func configureFirebase() {
    guard   let plistPath = Bundle.main.path(forResource: 
"GoogleService-Info-QA", ofType: "plist"),
        let options =  FirebaseOptions(contentsOfFile: plistPath)
        else { return }
    FirebaseApp.configure(options: options)
}

Но выдает ошибку

Terminating app due to uncaught exception 'FIRAppNotConfigured', 
reason: 'Failed to get default Firebase Database instance. Must 
call `[FIRApp configure]` (`FirebaseApp.configure()` in Swift) 
before using Firebase Database.

Ответы [ 3 ]

0 голосов
/ 17 июня 2019

Для этого подтверждения вам необходимо выполнить следующие шаги:

  1. Перейти к настройке проекта
  2. Выбрать цель Dev
  3. Перейти к этапу сборки
  4. Нажмите на иконку и создайте новый скрипт запуска с именем GOOGLESERVICE_INFO_PLIST
  5. используйте следующий скрипт

//Name of the resource we're selectively copying
GOOGLESERVICE_INFO_PLIST=GoogleService-Info.plist

//Get references to dev and prod versions of the GoogleService-Info.plist
//NOTE: These should only live on the file system and should NOT be part of the target (since we'll be adding them to the target manually)
GOOGLESERVICE_INFO_DEV=${PROJECT_DIR}/projectFolder/Firebase/Dev/${GOOGLESERVICE_INFO_PLIST}
GOOGLESERVICE_INFO_PROD=${PROJECT_DIR}/projectFolder/Firebase/Prod/${GOOGLESERVICE_INFO_PLIST}

//Make sure the dev version of GoogleService-Info.plist exists
echo "Looking for ${GOOGLESERVICE_INFO_PLIST} in ${GOOGLESERVICE_INFO_DEV}"

if [ ! -f $GOOGLESERVICE_INFO_DEV ]
then
echo "No Development GoogleService-Info.plist found. Please ensure it's in the proper directory."
exit 1
fi

//Make sure the prod version of GoogleService-Info.plist exists
echo "Looking for ${GOOGLESERVICE_INFO_PLIST} in ${GOOGLESERVICE_INFO_PROD}"
if [ ! -f $GOOGLESERVICE_INFO_PROD ]
then
echo "No Production GoogleService-Info.plist found. Please ensure it's in the proper directory."
exit 1
fi

//Get a reference to the destination location for the GoogleService-Info.plist
PLIST_DESTINATION=${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app
echo "Will copy ${GOOGLESERVICE_INFO_PLIST} to final destination: ${PLIST_DESTINATION}"

//Copy over the prod GoogleService-Info.plist for Release builds
if [ "${CONFIGURATION}" == "Release" ]
then
echo "Using ${GOOGLESERVICE_INFO_PROD}"
cp "${GOOGLESERVICE_INFO_PROD}" "${PLIST_DESTINATION}"
else
echo "Using ${GOOGLESERVICE_INFO_DEV}"
cp "${GOOGLESERVICE_INFO_DEV}" "${PLIST_DESTINATION}"
fi
  • Заключительный шаг: убедитесь, что вы разместили GoogleService-Info.plist в правильном месте расположения в проекте. Вы можете найти прикрепленное изображение для справки.

GOOGLESERVICE_INFO_DEV = $ {PROJECT_DIR} / projectFolder / Firebase / Dev / $ {GOOGLESERVICE_INFO_PLIST} GOOGLESERVICE_INFO_PROD = $ {PROJECT_DIR} / * * 10 * * * 1026{GOOGLESERVICE_INFO_PLIST}

projectFolder - папка вашего текущего проекта

enter image description here

0 голосов
/ 21 июня 2019

Я получил решение. Я переименовал файлы GoogleService-Info.plists в соответствующих средах. И добавили эти файлы в Build Phases -> Copy Bundle Resources. Затем добавили следующий код согласно выбранной среде

 guard let plistPath = Bundle.main.path(forResource: "nameOfTheGoogleService-Info.plistFileAsPerTheEnvironment", ofType: "plist"),
                let options =  FirebaseOptions(contentsOfFile: plistPath)
                else { return }
            if FirebaseApp.app() == nil{
            FirebaseApp.configure(options: options)
            }

Незначительное изменение заключается в том, что когда пользователь изменяет среду приложения, он должен удалить приложение из фона и открыть его снова. Затем AppDeleagte выбирает путь соответствующего GoogleService-Info.plist в соответствии с выбранной средой

0 голосов
/ 17 июня 2019

Поместите этот фрагмент кода в свой AppDelegate.swift в функции делегата didFinishLaunchingWithOptions приложения, где-то перед return true

//Configure Firebase based on the app's environment
#if DEV
   guard let filePath = Bundle.main.path(forResource: "GoogleService-Info-DEV", ofType: "plist") else { return }
   let options = FIROptions(contentsOfFile: filePath)
   FIRApp.configure(with: options!)
#elseif QA
   guard let filePath = Bundle.main.path(forResource: "GoogleService-Info-QA", ofType: "plist")  else { return }
   let options = FIROptions(contentsOfFile: filePath)
   FIRApp.configure(with: options!)
#endif

. Вам необходимо убедиться, что ваши plist-файлы имеют соответствующие имена, а такжеубедитесь, что они являются частью вашей цели:

  • Выберите файл GoogleService-Info-DEV и справа в FileInspector убедитесь, что флажок установлен для цели вашего приложения.Сделайте то же самое с файлом GoogleService-Info-QA.

Ваши файлы должны быть помещены в основную папку, как если бы вы поместили обычный файл Google-Info.plist.

...