studio pricing how google ios google-cloud-messaging google-signin

ios - pricing - Use diferentes GoogleService-Info.plist para diferentes esquemas de compilación



google sign in swift (11)

Estoy usando un esquema de compilación para prod y uno para la puesta en escena (con 2 identificadores de paquete diferentes) y estoy tratando de usar un GoogleService-Info.plist separado para cada esquema. ¿Hay alguna forma de seleccionar manualmente el archivo plist para usar al inicializar GCM (y el inicio de sesión goole)? ¿O es posible evitar el uso de plist y hacer la configuración manualmente?

¡Gracias!


Detalles

Probado en:

  • Xcode 9.2
  • Xcode 10.2 (10E125)

Solución

  1. Cree una carpeta con todos sus archivos Google.plist (con diferentes nombres) en el proyecto

  1. Agregar script de ejecución

No olvides cambiar el valor de PATH_TO_GOOGLE_PLISTS

Código

PATH_TO_GOOGLE_PLISTS="${PROJECT_DIR}/SM2/Application/Firebase" case "${CONFIGURATION}" in "Debug_Staging" | "AdHoc_Staging" ) cp -r "$PATH_TO_GOOGLE_PLISTS/GoogleService-Info-dev.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist" ;; "Debug_Poduction" | "AdHoc_Poduction" | "Distribution" | "Test_Poduction" ) cp -r "$PATH_TO_GOOGLE_PLISTS/GoogleService-Info-prod.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist" ;; *) ;; esac

Crear esquemas de nombres


Aquí se explica cómo hacerlo en Xamarin C #:

string plistPath = NSBundle.MainBundle.PathForResource ("GoogleService-Info", "plist"); Options options = new Options (plistPath); App.Configure (options);

Recuerde incluir el espacio de nombres de Firebase:

using Firebase.Analytics;


Con Xcode 9.2, he necesitado que los archivos para ambos objetivos se denominen "googleServiceInfo.plist" pero se coloquen en diferentes directorios, con el directorio / archivo para cada objetivo especificado en "Fases de compilación", "Copiar recursos de paquete".

Lo anterior no era mi solución preferida, pero anteriormente había intentado usar diferentes nombres de archivo en la línea de la respuesta de @inidona, convertida a Swift 4:

let filePath = Bundle.main.path(forResource: "googleServiceInfo-Pro", ofType: "plist")! let options = FirebaseOptions(contentsOfFile: filePath) FirebaseApp.configure(options: options!)

Desafortunadamente, esto no corrigió los mensajes de error de Firebase. En esta pregunta: Firebase iOS SDK: el uso de un archivo de configuración que no sea GoogleService-Info.plist genera una advertencia de consola que el póster original parece haberse solucionado al actualizar Firebase Pod, pero no lo he confirmado.


Consulte este artículo: https://medium.com/@brunolemos/how-to-setup-a-different-firebase-project-for-debug-and-release-environments-157b40512164

En Xcode, cree dos directorios dentro de su proyecto: Debug y Release . Coloque cada archivo GoogleService-Info.plist allí.

En AppDelegate.m , dentro del método didFinishLaunchingWithOptions , coloque el código:

C objetivo

NSString *filePath; #ifdef DEBUG NSLog(@"[FIREBASE] Development mode."); filePath = [[NSBundle mainBundle] pathForResource:@"GoogleService-Info" ofType:@"plist" inDirectory:@"Debug"]; #else NSLog(@"[FIREBASE] Production mode."); filePath = [[NSBundle mainBundle] pathForResource:@"GoogleService-Info" ofType:@"plist" inDirectory:@"Release"]; #endif FIROptions *options = [[FIROptions alloc] initWithContentsOfFile:filePath]; [FIRApp configureWithOptions:options];

Swift 4

var filePath:String! #if DEBUG print("[FIREBASE] Development mode.") filePath = Bundle.main.path(forResource: "GoogleService-Info", ofType: "plist", inDirectory: "Debug") #else print("[FIREBASE] Production mode.") filePath = Bundle.main.path(forResource: "GoogleService-Info", ofType: "plist", inDirectory: "Release") #endif let options = FirebaseOptions.init(contentsOfFile: filePath)! FirebaseApp.configure(options: options)

Arrastre y suelte las carpetas de Debug y Release a las Build Phases > Copy Bundle Resources :

Eso es :)


Creo que no es posible lograrlo sin usar GoogleService-Info.plist. Porque antes de que pueda comenzar a integrar su aplicación iOS con los componentes de inicio de sesión de Google, debe descargar las dependencias y configurar su proyecto Xcode. Y este process muestra que GoogleService-Info.plist tiene un gran factor en él.

Entonces, las soluciones y la idea aquí en esta pregunta SO pueden ayudarlo con su problema. Simplemente moví la copia principal de la lista GoogleService-Info plist fuera de la aplicación en 2 carpetas separadas, luego usé el "Copiar archivos" de las fases de compilación en cada destino para importar la lista específica de destino en la carpeta Recursos.

También revise esta pregunta SO , podría darle más información / idea a su problema.


Creo que puede usar esta forma para configurar su GoogleService-Info.plist dinámicamente y usar diferentes nombres para diferentes identificadores de paquetes.

ciao Andreas

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"GoogleService-Info" ofType:@"plist"]; FIROptions *options = [[FIROptions alloc] initWithContentsOfFile:filePath]; [FIRApp configureWithOptions:options];


Esta es mi solución!

NSString *filePath; if([self isProduction]){ filePath = [[NSBundle mainBundle] pathForResource:@"GoogleService-Info" ofType:@"plist"]; }else{ filePath = [[NSBundle mainBundle] pathForResource:@"GoogleService-Info-Sandbox" ofType:@"plist"]; } FIROptions *options = [[FIROptions alloc] initWithContentsOfFile:filePath]; [FIRApp configureWithOptions:options];

¡Y eso es!


La respuesta de @inidona funcionó para mí. Después de convertirlo a Swift

para Swift 2.3:

let filePath = NSBundle.mainBundle().pathForResource("GoogleService-Info", ofType: "plist") let options = FIROptions(contentsOfFile: filePath) FIRApp.configureWithOptions(options)

para Swift 3.0:

let filePath = Bundle.main.path(forResource: "GoogleService-Info", ofType: "plist")! let options = FIROptions(contentsOfFile: filePath) FIRApp.configure(with: options)

para Swift 4.0:

let filePath = Bundle.main.path(forResource: "GoogleService-Info", ofType: "plist")! let options = FirebaseOptions(contentsOfFile: filePath) FirebaseApp.configure(options: options!)


No puedes evitar usar el plist con Firebase. La mejor solución que he encontrado hasta ahora para ti sería agregar ambos archivos y nombrarlos

GoogleService-Info_stage.plist

y

GoogleService-Info_prod.plist

Luego, desde su código, puede llamar al archivo correcto. De esta manera no se bloqueará su aplicación si no tiene el archivo. Simplemente reemplace FILENAME con GoogleService-Info_prod o GoogleService-Info_stage.

if let configFile = Bundle.main.path(forResource: "FILENAME", ofType: "plist"), let options = FirebaseOptions(contentsOfFile: configFile) { FirebaseApp.configure(options: options) }


Noté que google espera que el nombre del archivo sea GoogleServiceInfo.plist en el código:

* The method |configureWithError:| will read from the file GoogleServices-Info.plist bundled with * your app target for the keys to configure each individual API. To generate your * GoogleServices-Info.plist, please go to https://developers.google.com/mobile/add * * @see GGLContext (Analytics) * @see GGLContext (SignIn) */ @interface GGLContext : NSObject

la frase clave es esta

lea el archivo GoogleServices-Info.plist incluido con el objetivo de su aplicación

Así que simplemente copié el mismo archivo y lo puse en diferentes directorios, y lo limité a diferentes objetivos:


Si GoogleService-Info.plist tiene un nombre diferente, afectará sus resultados analíticos. Firebase te advertirá sobre esto. https://github.com/firebase/firebase-ios-sdk/issues/230#issuecomment-327138180 . Por esta razón, ninguna de estas soluciones de tiempo de ejecución proporcionará los mejores resultados analíticos.

Hay dos soluciones que no se meterán con Analytics.

  1. Use un objetivo diferente con cada esquema y asocie cada versión de GoogleService-Info.plist con su propio objetivo. Consulte Membresía de destino en el inspector de archivos en el lado derecho de Xcode. Para más información Ver esta pregunta .

  2. Use un script de fase de compilación para copiar la versión correcta de GoogleService-Info.plist en el directorio de compilación. Utilizo un ID de paquete diferente para la puesta en escena y la producción. Esto me permite tener ambas versiones de la aplicación instaladas en paralelo. También significa que con el siguiente script puedo nombrar mis diferentes archivos GoogleService-Info.plist con el ID del paquete. Por ejemplo:

    • GoogleService-Info-com.example.app.plist
    • GoogleService-Info-com.example.app.staging.plist

Script de fase de compilación

PATH_TO_CONFIG=$SRCROOT/Config/GoogleService-Info-$PRODUCT_BUNDLE_IDENTIFIER.plist FILENAME_IN_BUNDLE=GoogleService-Info.plist BUILD_APP_DIR=${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app echo cp $PATH_TO_CONFIG "$BUILD_APP_DIR/$FILENAME_IN_BUNDLE" cp $PATH_TO_CONFIG "$BUILD_APP_DIR/$FILENAME_IN_BUNDLE"

Nota: Tendrá que cambiar PATH_TO_CONFIG para adaptarse a su configuración.