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!
Testé sur:
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
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!)
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];
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
:
C'est ça :)
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:
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.
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 .
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
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.
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!
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;
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.
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é.
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)
}