En una nueva Firebase, ¿cómo usar múltiples files de configuration en xcode?

Oye, estoy jugando con el nuevo SDK para iOS, en mi proyecto, solo tengo un objective. Creé dos configuraciones, Debug y Release, con un identificador de package diferente, pero parece que el file de configuration descargado de la base de firewall solo admite un identificador de package.

Entonces, ¿alguien sabe cómo usar firebase dentro de un proyecto xcode de un package múltiple?

¡Gracias!

Actualizado con una solución más sencilla:

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 

Mi primer bash que no solucionó el problema:

Cambié el nombre del segundo GoogleService-Info.json por otra cosa y utilicé el código siguiente para configurar Firebase desde 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) 

Si ejecuto el objective de Staging, recibiré la queja de Firebase sobre 'No se pudo encontrar el file de configuration:' GoogleService-Info.plist '.'. Pero luego dice 'Firebase Analytics v.3300000 started'.

Al revisar el panel de Firebase, las aplicaciones de producción y de puesta en escena tienen registrados los events de usuario entrantes.

El método configureWithOptions mencionado anteriormente no está documentado en la documentation de Firebase, lo descubrí al verificar su código fuente. No estoy seguro de cuál podría ser la desventaja de llamar esto. Me encantaría escuchar otros enfoques.

He implementado algo similar, ya que he tenido dos esquemas para un único objective que tienen diferentes identificadores de package. En mis ejemplos a continuación, tengo dos esquemas diferentes, uno para UAT y otro para PROD.

Cree los dos files GoogleService-Info.json y colóquelos en su directory de proyecto (no en el proyecto Xcode) en diferentes carpetas, por ejemplo,

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

A continuación, agregue los files a su proyecto Xcode de la siguiente manera:

El proyecto Xcode recomendó la estructura de carpetas.

Ahora necesita agregar un script de ejecución en sus fases de compilation. Esto deberá agregarse antes de la etapa de Fuentes de compilation:

Arrastre el script de ejecución a fuentes de compilación anteriores

Este Run Script toma el file json ubicado apropiadamente y lo duplica en el directory de la aplicación de creación, lo que significa que Firebase / Google lo identificará de forma idéntica a cómo identificaría el file en una sola configuration de identificador.

 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}/" 

Estaría seguro de que también puede usar esta misma lógica para Google Analytics, que utiliza una configuration de file de configuration json similar.

Un mejor enfoque si tiene un objective individual es simplemente nombrar sus configuraciones apropiadamente y cargarlas como se muestra a continuación. Parece que funciona bien para el ejemplo de entorno 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) 

Agrega ambos services de Google a tu proyecto, con diferentes nombres:

introduzca la descripción de la imagen aquí

Luego, para cada esquema de compilation, select Editar esquema y agregue un valor único para una variable de entorno como:

introduzca la descripción de la imagen aquí

Por lo tanto, la otra variable de entorno BUILD_FOR del esquema de compilation se establecerá en "DEV", por ejemplo.

Luego, verificará esta variable en el Delegado de aplicaciones y configurará el FIRApp de acuerdo con el esquema que se creó:

  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!) 

Almacené 2 GoogleService-Info con diferentes nombres:

  • GoogleService-Info.plist para producción
  • GoogleService-Info-Debug.plist para el desarrollo

Y luego vaya a Build Phases , agregue nuevo script de ejecución:

 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 

Usando Objective-C, en su AppDeletage.m:

 #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];