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!
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.
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:
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:
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.
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)
J'ai enregistré 2 GoogleService-Info sous différents noms:
GoogleService-Info.plist
pour la productionGoogleService-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
Ajoutez les deux plistes de service Google à votre projet, avec des noms différents:
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:
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!)
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];
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)
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
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