web-dev-qa-db-fra.com

Dans la nouvelle Firebase, comment utiliser plusieurs fichiers de configuration dans xcode?

Hé, je joue avec le nouveau SDK iOS de Firebase. Dans mon projet, je n’ai qu’une cible. J'ai créé deux configurations, Debug et Release, avec un identificateur d’ensemble différent, mais le fichier de configuration téléchargé depuis Firebase ne prend en charge qu’un seul identifiant.

Ainsi, tout le monde sait comment utiliser firebase dans un projet xcode d’identificateurs multiples?

Merci!

31
coolbeet

Mise à jour: voir la documentation officielle de Firebasehttps://firebase.google.com/docs/projects/multiprojects

Mise à jour avec une solution plus simple:

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 

Ma première tentative qui n'a pas résolu le problème:

J'ai renommé le deuxième GoogleService-Info.json en quelque chose d'autre et j'ai utilisé le code suivant pour configurer Firebase à partir d'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 j'exécute la cible Staging, je recevrai la plainte de Firebase sur le message "Impossible de localiser le fichier de configuration:" GoogleService-Info.plist ".". Mais ensuite, il est indiqué que «Firebase Analytics v.3300000 a démarré». 

Comme indiqué dans le tableau de bord Firebase, les événements utilisateur entrants sont consignés dans les applications de production et de transfert.

La méthode configureWithOptions mentionnée ci-dessus n'est pas décrite dans la documentation de Firebase. Je l'ai trouvée en vérifiant son code source. Je ne suis pas sûr de ce qui pourrait être l'inconvénient d'appeler cela. J'aimerais entendre d'autres approches.

44
Chris Chen

J'ai mis en œuvre quelque chose de similaire, car j'ai eu deux schémas pour une même cible qui ont des identificateurs de bundle différents. Dans mes exemples ci-dessous, j'ai deux systèmes différents, un pour UAT et un pour PROD.

Créez les deux fichiers GoogleService-Info.json et placez-les dans le répertoire de votre projet (pas le projet Xcode) dans des dossiers différents, par exemple.

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

Ajoutez ensuite les fichiers à votre projet Xcode de la manière suivante:

 Xcode project advised folder structure

Vous devez maintenant ajouter un script d’exécution dans vos phases de construction. Ceci devra être ajouté avant l'étape de compilation des sources:

 Drag the Run Script to above Compile Sources

Ce script d'exécution prend le fichier json situé de manière appropriée et le duplique dans le répertoire de l'application de construction, ce qui signifie que Firebase/Google l'identifiera de la même manière que le fichier dans une configuration d'identificateur unique.

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

Je pense que vous pouvez également utiliser cette même logique pour Google Analytics, qui utilise une configuration de fichier json config similaire.

15
Chris Conway

Une meilleure approche si vous avez un seul objectif est de simplement nommer vos configurations de manière appropriée et de les charger comme ci-dessous. Semble fonctionner correctement pour l’environnement UAT Exemple: 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)
11
TheiOSChap

J'ai enregistré 2 GoogleService-Info sous différents noms:

  • GoogleService-Info.plist pour la production
  • GoogleService-Info-Debug.plist pour le développement 

Et puis allez à Build Phases, ajoutez un nouveau script d'exécution:

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
8
Tai Le

Ajoutez les deux plistes de service Google à votre projet, avec des noms différents:

 enter image description here

Ensuite, pour chaque schéma de construction, sélectionnez Modifier le schéma et ajoutez une valeur unique pour une variable d'environnement, comme ceci:

 enter image description here

Ainsi, la variable d'environnement BUILD_FOR de l'autre schéma de construction serait définie sur "DEV", par exemple.

Ensuite, vous devriez vérifier cette variable dans App Delegate et configurer le FIRApp en fonction du schéma créé:

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

En utilisant Objective-C, dans votre 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];
3
Bruno Lemos

Firebase inclut documentation officielle pour savoir comment le faire maintenant. J'ai utilisé cette méthode dans mon application et cela fonctionne très bien. 

Plus précisément, j'ai défini un indicateur Swift personnalisé "BUILD_TYPE" dans XCode et, pour chaque schéma, je définis une valeur unique pour cet indicateur. Ensuite, dans mon AppDelegate, j'indique à Firebase le fichier GoogleService-___.plist à charger à l'exécution à l'aide de cette valeur d'indicateur 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)
2
levibostian

Je vois beaucoup de réponses à l'aide de cibles, mais si vous voulez différencier par schéma, vous pouvez aller à:

Éditer les schémas ...> Sélectionner un schéma> Construire> Post-Action

  • Ajouter un script d'exécution
  • Fournissez les paramètres de construction à partir de: (sélectionnez la cible que vous souhaitez)
  • Ajouter le script suivant
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"

N'oubliez pas de changer le PATH_TO_GOOGLE_PLISTS

Échantillon:  Sample

0
RodolfoAntonici