154 votes

Utiliser différents GoogleService-Info.plist pour différents schémas de construction

J'utilise un schéma de construction pour prod et un pour staging (avec 2 identifiants de bundle différents) et j'essaie d'utiliser un GoogleService-Info.plist distinct pour chaque schéma. Existe-t-il un moyen de sélectionner manuellement le fichier plist à utiliser lors de l'initialisation de GCM (et du login goole) ? Ou est-il possible d'éviter d'utiliser le fichier plist et de procéder à la configuration manuellement ?

Merci !

3 votes

Vous utilisez deux cibles différentes ? Vous avez alors des fichiers différents (avec le même nom) dans différentes ressources de Copy Bundle (dans les phases de construction).

6 votes

Cet article m'a été utile medium.com/rocket-fuel/ .

0 votes

Cela a parfaitement fonctionné pour moi stackoverflow.com/a/58709334/11537677

190voto

Vasily Bodnarchuk Points 8047

Détails

Testé sur :

  • Xcode 9.2
  • Xcode 10.2 (10E125)
  • Xcode 11.0 (11A420a)

Solution

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

enter image description here

  1. Ajouter l'exécution de script

enter image description here

N'oubliez pas 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

Noms de régimes de construction

enter image description here

2 votes

Sauvez ma journée, excellente réponse

1 votes

C'est la bonne réponse. Apparemment Firebase Analytics a besoin de ce fichier plist dans le répertoire racine de votre application, même si vous appelez configure(options:) . github.com/firebase/quickstart-ios/issues/5

2 votes

C'est une très bonne solution et elle devrait être acceptée comme la réponse.

87voto

Essam Elmasry Points 600

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

1 votes

Avec le code ci-dessus, vous avez deux fichiers différents GoogleService-Info.plist à des endroits différents ou deux fichiers avec des noms différents. Pourriez-vous nous fournir des informations supplémentaires sur les noms de fichiers réels et leur emplacement ?

1 votes

J'ai 2 fichiers nommés GoogleService-Info-dev.plist GoogleService-Info-live.plist ce code vous permet d'indiquer à votre application avec quel fichier d'information vous voulez travailler au lieu du fichier par défaut GoogleService-Info-dev.plist utilisez une déclaration conditionnelle ou des drapeaux cibles pour alterner entre vos fichiers.

0 votes

Oui, dans l'AppDelegate

35voto

Bruno Lemos Points 143

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

Sur Xcode, créez deux répertoires à l'intérieur de votre projet : Debug et Release . Mettez chaque GoogleService-Info.plist à cet endroit.

Sur AppDelegate.m à l'intérieur de la didFinishLaunchingWithOptions mettez le code :

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

Glisser-déposer les deux Debug et Release vers les dossiers Build Phases > Copy Bundle Resources :

Build Phases > Copy Bundle Resources

C'est tout :)

2 votes

Cela a fonctionné pour moi. Vous devez ajouter ces dossiers là comme référence, sinon ça va planter, en effet. Merci !

0 votes

Cette solution ne résout toujours pas le problème pour les personnes suivantes Analytics vous ne pouvez pas savoir quelle .plist est en cours de chargement.

0 votes

@Bruno Lemos, Puis-je utiliser simultanément deux projets Firebase à partir d'un seul projet xcode ? Pas comme Debug & Release ? Parce que quand j'essaie de faire ça, je me retrouve toujours avec already configured crash. J'ai suivi les dernières instructions du document officiel de Firebase. Merci

28voto

inidona Points 198

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

5 votes

Avec le code ci-dessus, avez-vous deux fichiers différents GoogleService-Info.plist à des emplacements différents ou peut-être deux fichiers avec des noms différents. Pourriez-vous nous fournir plus d'informations sur les noms de fichiers réels et leur emplacement ?

4 votes

J'obtiens cette erreur dans le journal pendant l'appel configureWithOptions : Could not locate configuration file: 'GoogleService-Info.plist'

4voto

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 !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X