web-dev-qa-db-fra.com

Utilisez différents GoogleService-Info.plist pour différents modèles de construction

J'utilise un schéma de construction pour prod et un pour le transfert (avec 2 identificateurs de paquet différents) et j'essaie d'utiliser un fichier GoogleService-Info.plist distinct pour chaque schéma. Est-il possible de sélectionner manuellement le fichier plist à utiliser lors de l'initialisation de GCM (et de la connexion goole)? Ou est-il possible d'éviter d'utiliser le plist et d'effectuer la configuration manuellement?

Merci!

68
nwaxgui

Détails

Testé sur:

  • Xcode 9.2
  • Xcode 10.2 (10E125)

Solution

  1. Créez un dossier avec tous vos fichiers Google.plist (avec des noms différents) dans le projet.

enter image description here

  1. Ajouter un script d'exécution

enter image description here

Ne pas oublier de changer PATH_TO_GOOGLE_PLISTS valeur

Code

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

Construire des noms de schémas

enter image description here

74
Vasily Bodnarchuk

La réponse de @inidona a fonctionné pour moi. Après l'avoir converti en Swift

pour Swift 2.3:

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

pour Swift 3.0:

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

pour Swift 4.0:

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

Je pense que vous pouvez utiliser cette méthode pour configurer votre GoogleService-Info.plist de manière dynamique et utiliser différents noms pour différents identifiants de bundle.

ciao Andreas

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

Consultez cet article: https://medium.com/@brunolemos/how-to-setup-a-different-firebase-project-for-debug-and-release-environments-157b40512164

Sous Xcode, créez deux répertoires dans votre projet: Debug et Release. Mettez chaque GoogleService-Info.plist fichier ici.

Sur AppDelegate.m, dans la méthode didFinishLaunchingWithOptions, insérez le code:

Objective-C

  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)

Faites glisser les deux dossiers Debug et Release vers le dossier Build Phases > Copy Bundle Resources:

Build Phases > Copy Bundle Resources

C'est ça :)

22
Bruno Lemos

J'ai remarqué que Google s'attend à ce que le nom de fichier soit GoogleServiceInfo.plist dans le code:

 * 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 phrase clé est celle-ci

lire à partir du fichier GoogleServices-Info.plist fourni avec la cible de votre application

J'ai donc simplement copié le même fichier et l'ai placé dans différents répertoires, puis lié à différentes cibles:

enter image description here

8
abbood

Si la GoogleService-Info.plist a un nom différent qui affectera vos résultats d'analyse. Firebase vous en avertira. https://github.com/firebase/firebase-ios-sdk/issues/230#issuecomment-32713818 . Pour cette raison, aucune de ces solutions d'exécution ne fournira les meilleurs résultats d'analyse.

Il existe deux solutions qui ne dérangeront pas Analytics.

  1. Utilisez une cible différente avec chaque schéma et associez chaque version de GoogleService-Info.plist avec sa propre cible. Voir Appartenance cible dans l'inspecteur de fichiers situé à droite dans Xcode. . Pour plus d'informations Voir cette question .

  2. Utilisez un script de phase de construction pour copier la version correcte de GoogleService-Info.plist dans le répertoire de construction. J'utilise un ID de lot différent pour la mise en scène et la production. Cela me permet d’installer les deux versions de l’application en parallèle. Cela signifie également qu'avec le script ci-dessous, je peux nommer mes différents GoogleService-Info.plist fichiers avec l'ID de l'ensemble. Par exemple:

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

Script de phase de construction

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"

Remarque: vous devrez changer PATH_TO_CONFIG pour vous adapter.

Build Phase Script

4
Onato

C'est ma solution!

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

Et c'est tout!

2

Voici comment procéder dans Xamarin C #:

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

N'oubliez pas d'inclure l'espace de noms Firebase:

using Firebase.Analytics;
1
Sune Kjærgård

Je pense qu'il n'est pas possible d'y arriver sans utiliser le GoogleService-Info.plist. Avant de pouvoir intégrer votre application iOS aux composants Google Sign-In, vous devez télécharger les dépendances et configurer votre projet Xcode. Et ce processus montre que GoogleService-Info.plist a un facteur important.

Ainsi, les solutions et les idées présentées ici SO question peuvent vous aider à résoudre votre problème. Vient de déplacer la copie principale du GoogleService-Info plist sur l'application dans 2 dossiers distincts, puis utilisez les phases de copie "Copier les fichiers" de chaque cible pour importer la liste de diffusion spécifique à la cible dans le dossier Ressources.

Vérifiez également ceci SO question , cela pourrait vous donner plus d’informations/idées sur votre problème.

1
KENdi

Avec Xcode 9.2, j’avais besoin que les fichiers des deux cibles soient nommés "googleServiceInfo.plist" mais placés dans des répertoires différents, avec le répertoire/fichier de chaque cible spécifié dans "Build Phases", "Copier les ressources du bundle".

Ce qui précède n’était pas ma solution préférée, mais j’avais déjà essayé d’utiliser différents noms de fichiers dans le sens de la réponse de @inidona, convertis en Swift 4:

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

Malheureusement, cela n'a pas corrigé les messages d'erreur de Firebase. Dans cette question: Firebase iOS SDK - L'utilisation d'un fichier de configuration autre que GoogleService-Info.plist génère un avertissement de la console l'affiche d'origine semble avoir été corrigée en mettant à jour le pod Firebase, mais je ne l'ai pas encore confirmé.

1
djruss70

Vous ne pouvez pas éviter d'utiliser le plist avec Firebase. La meilleure solution que j'ai trouvée jusqu'à présent pour vous serait d'ajouter les deux fichiers et de les nommer.

GoogleService-Info_stage.plist

et

GoogleService-Info_prod.plist

Ensuite, à partir de votre code, vous pouvez appeler le bon fichier. De cette façon, votre application ne sera pas bloquée si vous n'avez pas le fichier. Il suffit de remplacer FILENAME par GoogleService-Info_prod ou GoogleService-Info_stage.

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