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

В новой Firebase, как использовать несколько файлов конфигурации в xcode?

Эй, я играю с новым SDK firebase iOS, в моем проекте у меня есть только одна цель, я создал две конфигурации Debug и Release с другим идентификатором поставщика, но похоже, что файл конфигурации, загруженный из firebase, поддерживает только один идентификатор пакета.

Итак, кто-нибудь знает, как использовать firebase в проекте xcode с идентификатором нескольких пакетов?

Спасибо!

4b9b3361

Ответ 1

Обновление: см. Официальную документацию Firebase https://firebase.google.com/docs/projects/multiprojects

Обновлен с более простым решением:

1. keep the same names for both GoogleService-Info.plist
2. put one GoogleService-Info.plist inside a subfolder, say "staging"
3. add references to both files in Xcode while linking them to corresponding targets
4. just use FIRApp.configure() in your AppDelegate, done 

Моя первая попытка, которая не решила проблему:

Я переименовал второй GoogleService-Info.json во что-то другое и использовал следующий код для настройки Firebase из AppDelegate.

// Swift code
#if STAGING
    let firebasePlistFileName = "GoogleService-Staging-Info"
#else
    let firebasePlistFileName = "GoogleService-Info"
#endif
let firbaseOptions = FIROptions(contentsOfFile: NSBundle.mainBundle().pathForResource(firebasePlistFileName, ofType: "plist"))
FIRApp.configureWithOptions(firbaseOptions)

Если я запустил целевой объект Staging, я получу жалобу Firebase на "Не удалось найти файл конфигурации:" GoogleService-Info.plist ".". Но затем говорится: "Firebase Analytics v.3300000 запущен".

Как я уже отмечал на панели инструментов Firebase, и производственные, и промежуточные приложения регистрируют входящие пользовательские события.

Вышеупомянутый метод configureWithOptions не описан в документации Firebase, я выяснил это, проверив его исходный код. Я не уверен в том, что может быть недостатком в названии этого. Я хотел бы услышать другие подходы.

Ответ 2

Я реализовал нечто подобное, так как у меня было две схемы для одной цели с разными идентификаторами пакетов. В моих примерах ниже, у меня есть две разные схемы: одна для UAT и одна для PROD.

Создайте два файла GoogleService-Info.json и поместите их в каталог проекта (не проект Xcode) в разных папках, например.

ROOT/config/UAT/GoogleService-Info.json
ROOT/config/PROD/GoogleService-Info.json

Затем добавьте файлы в проект Xcode следующим образом:

Xcode project advisted структура папок

Теперь вам нужно добавить Run Script на фазах сборки. Это необходимо добавить до этапа "Источники компиляции":

Перетащите Run  Script в файлы источников компиляции

Этот Run Script берет соответствующий Json файл и дублирует его в каталоге приложения для сборки, то есть Firebase/Google идентифицирует его идентично тому, как он идентифицирует файл в настройке одного идентификатора.

isUAT=`expr "$GCC_PREPROCESSOR_DEFINITIONS" : ".*UAT=\([0-9]*\)"`

RESOURCE_PATH=${SRCROOT}/${PRODUCT_NAME}/config/PROD

if [ $isUAT = 1 ]; then
    RESOURCE_PATH=${SRCROOT}/${PRODUCT_NAME}/config/UAT
fi

BUILD_APP_DIR=${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app

echo "Copying all files under ${RESOURCE_PATH} to ${BUILD_APP_DIR}"
cp -v "${RESOURCE_PATH}/"* "${BUILD_APP_DIR}/"

Я бы оценил, что вы можете использовать эту же логику для Google Analytics, в которой используется аналогичная настройка файла json.

Ответ 3

Улучшенный подход, если у вас есть единственная цель, просто указать свои конфигурации соответствующим образом и загрузить их, как показано ниже. Кажется, отлично работает для среды UAT пример: Swift 3.0

    var fireBaseConfigFile = Bundle.main.path(forResource: "GoogleService-Info-PROD", ofType: "plist")
   #if UAT
       fireBaseConfigFile = Bundle.main.path(forResource: "GoogleService-Info-UAT", ofType: "plist")
   #endif

   guard let firOptions = FIROptions(contentsOfFile: fireBaseConfigFile) else {
       assert(false, "Failed to load Firebase config file")
       return
   }

   FIRApp.configure(with: firOptions)

Ответ 4

Я сохранил 2 GoogleService-Info с разными именами:

  • GoogleService-Info.plist для производства
  • GoogleService-Info-Debug.plist для разработки

И затем перейдите к Build Phases, добавьте новый запуск script:

if [ "${CONFIGURATION}" == "Release" ]; then
cp -r "${PROJECT_DIR}/PathToYourGoogleServiceInfoFile/GoogleService-Info.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist"

echo "Production plist copied"

elif [ "${CONFIGURATION}" == "Debug" ]; then

cp -r "${PROJECT_DIR}/PathToYourGoogleServiceInfoFile/GoogleService-Info-Debug.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist"

echo "Development plist copied"
fi

Ответ 5

Добавьте оба списка служб Google в свой проект под разными именами:

enter image description here

Затем для каждой схемы сборки выберите "Редактировать схему" и добавьте уникальное значение для переменной среды, например:

enter image description here

Так, например, для переменной среды BUILD_FOR для другой схемы сборки будет задано значение "DEV".

Затем вы должны проверить эту переменную в App Delegate и настроить FIRApp в соответствии с тем, какая схема была построена:

    let buildFor = ProcessInfo.processInfo.environment["BUILD_FOR"]! as String
    var firebasePlistFileName = "GoogleService-Info"

    if buildFor == "PROD" {
        firebasePlistFileName = "GoogleService-Prod-Info"
    }

    let firbaseOptions = FIROptions(contentsOfFile: Bundle.main.path(forResource: firebasePlistFileName, ofType: "plist"))
    FIRApp.configure(with: firbaseOptions!)

Ответ 6

Используя Objective-C, в вашем AppDeletage.m:

NSString *filePath;
#ifdef DEBUG
  filePath = [[NSBundle mainBundle] pathForResource:@"GoogleService-Info-Debug" ofType:@"plist"];
#else
  filePath = [[NSBundle mainBundle] pathForResource:@"GoogleService-Info-Production" ofType:@"plist"];
#endif

  FIROptions *options = [[FIROptions alloc] initWithContentsOfFile:filePath];
  [FIRApp configureWithOptions:options];

Ответ 7

Firebase включает в себя официальную документацию о том, как сделать это сейчас. Я использовал этот метод в своем приложении, и он прекрасно работает.

Более конкретно, я определил пользовательский флаг Swift "BUILD_TYPE" в XCode, и для каждой схемы я определяю уникальное значение для этого флага. Затем в своем AppDelegate я сообщаю Firebase, какой GoogleService-___.plist загружать во время выполнения, с помощью этого значения флага Swift:

    let filePath = Bundle.main.path(forResource: "GoogleService-" + Bundle.main.infoDictionary!["BUILD_FLAVOR"] as! String, ofType: "plist")
    guard let fileopts = FirebaseOptions.init(contentsOfFile: filePath!) else {
        fatalError("Couldn't load config file")
    }
    FirebaseApp.configure(options: fileopts)

Ответ 8

Я вижу много ответов с использованием целей, но если вы хотите различить по схеме, вы можете перейти к:

Изменить схемы...> Выбрать схему> Построить> Пост-действие

  • Добавить скрипт запуска
  • Укажите настройки сборки из: (выберите цель, которую вы хотите)
  • Добавить следующий скрипт
PATH_TO_GOOGLE_PLISTS="${PROJECT_DIR}/MVCVMRC/Supporting Files/FirebasePlist"

cp -r "$PATH_TO_GOOGLE_PLISTS/Brazil/GoogleService-Info-preprod.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist"

Не забудьте изменить PATH_TO_GOOGLE_PLISTS

Образец: Sample