39 votes

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

Hé, je joue avec le nouveau SDK iOS Firebase, dans mon projet, je n'ai qu'une seule cible, j'ai créé deux configurations, Debug et Release, avec un identifiant de bundle différent , mais il semble que le fichier de configuration téléchargé depuis firebase ne supporte qu'un seul identifiant de bundle.

Alors, n'importe qui sait comment utiliser Firebase dans un projet xcode à identifiants multiples?

Merci!

53voto

Chris Chen Points 1783

Mise à jour: voir Firebase la documentation officielle https://firebase.google.com/docs/configure/#support_multiple_environments_in_your_ios_application

Mise à jour avec une solution plus facile:

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 de résoudre le problème:

J'ai renommé le deuxième GoogleService-Info.json à autre chose et utilisé le code suivant pour configurer Firebase de 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 je lance la mise en scène de la cible, je vais recevoir Firebase plainte au sujet de 'impossible de localiser le fichier de configuration: 'GoogleService-Info.plist'.'. Mais alors, il dit "Firebase Analytics v. 3300000 commencé".

Comme je l'ai vérifié sur le Firebase tableau de bord, à la fois la production et la mise en scène applications ont entrant les événements de l'utilisateur connecté.

La mentionnés ci-dessus configureWithOptions méthode n'est pas documentée dans Firebase de la documentation, je me suis rendu compte en vérifiant son code source. Je ne suis pas sûr de ce que pourrait être l'inconvénient de l'appel de cette. J'aimerais entendre d'autres approches.

17voto

Chris Conway Points 863

J'ai mis en place quelque chose de similaire, comme je l'ai eu deux programmes pour une cible unique, qui ont différents bundle identifiants. Dans mes exemples ci-dessous, j'ai deux régimes différents, l'un pour l'UAT et un pour la PROD.

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

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

Puis ajouter les fichiers à votre projet Xcode comme suit:

Xcode project advised folder structure

Maintenant, vous devez ajouter un Exécuter un Script dans vos Phases de construction. Cela doit être ajouté avant de le Compiler les Sources étape:

Drag the Run Script to above Compile Sources

Cet Exécuter le Script prend la bien situé fichier json et les doublons dans la construction de l'app directory, ce qui signifie Firebase/Google permettra d'identifier de la même manière à identifier le fichier dans un seul réglage de l'identifiant.

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 dirais que vous pouvez utiliser cette même logique pour Google Analytics, qui utilise un semblable json fichier de configuration de l'installation.

13voto

TheiOSChap Points 181

La meilleure approche si vous avez une seule cible est de simplement nommer vos configurations correctement et de les charger comme ci-dessous. Semble fonctionner correctement pour un 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)
 

11voto

Tai Le Points 2489

J'ai stocké 2 GoogleService-Info avec des noms différents:

  • 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
 

11voto

vikzilla Points 2069

Ajouter à la fois des Services Google plists à votre projet, avec des noms différents:

enter image description here

Ensuite, pour chaque Build Schéma, sélectionnez Modifier le Schéma et ajouter une valeur unique pour une variable d'environnement comme suit:

enter image description here

Donc, de l'autre construire du régime BUILD_FOR variable d'environnement devrait être fixé à "DEV", par exemple.

Ensuite, vous devez cocher pour cette variable dans Délégué d'Application et configurer le FIRApp selon le schéma de qui a été construit:

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

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