Użyj różnych GoogleService-Info.plist dla różnych schematów kompilacji

114

Używam schematu kompilacji dla produktu i jednego dla przemieszczania (z 2 różnymi identyfikatorami pakietów) i próbuję użyć oddzielnego GoogleService-Info.plist dla każdego schematu. Czy istnieje sposób, aby ręcznie wybrać plik plist do użycia podczas inicjowania GCM (i logowania goole)? A może można uniknąć używania plist i przeprowadzić konfigurację ręcznie?

Dzięki!

nwaxgui
źródło
3
Używasz dwóch różnych celów? Następnie miej różne pliki (o tej samej nazwie) w różnych zasobach Copy Bundle (w fazach kompilacji).
Alexander Zimin
6
Ten artykuł był dla mnie pomocny medium.com/rocket-fuel/… .
Eugeny
Dla mnie działało idealnie stackoverflow.com/a/58709334/11537677
Knight Fighter

Odpowiedzi:

146

Detale

Przetestowano na:

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

Rozwiązanie

  1. Utwórz folder ze wszystkimi plikami Google.plist (o różnych nazwach) w projekcie

wprowadź opis obrazu tutaj

  1. Dodaj skrypt uruchamiania

wprowadź opis obrazu tutaj

Nie zapomnij zmienić wartości PATH_TO_GOOGLE_PLISTS

Kod

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

Nazwy schematów budowania

wprowadź opis obrazu tutaj

Wasilij Bodnarczuk
źródło
2
Zachowaj mój dzień świetna odpowiedź
Siddh
1
To jest właściwa odpowiedź. Wygląda na to, że Firebase Analytics wymaga tego pliku plist w katalogu głównym aplikacji, nawet jeśli zadzwonisz configure(options:). github.com/firebase/quickstart-ios/issues/5
Rob Bajorek
2
To bardzo fajne rozwiązanie i należy je przyjąć jako odpowiedź.
Luke Brandon Farrell
1
Bardzo lekki i inteligentny, świetna odpowiedź. Dziękuję Ci!
gabuchan
1
@smileBot możesz pominąć -r, więcej informacji: polecenie cp w systemie Linux / Unix
Wasilij Bodnarchuk
76

Odpowiedź @inidona zadziałała dla mnie. Po przekonwertowaniu go na Swift

dla Swift 2.3:

let filePath = NSBundle.mainBundle().pathForResource("GoogleService-Info", ofType: "plist")
let options = FIROptions(contentsOfFile: filePath)
FIRApp.configureWithOptions(options)

dla Swift 3.0:

let filePath = Bundle.main.path(forResource: "GoogleService-Info", ofType: "plist")!
let options = FIROptions(contentsOfFile: filePath)
FIRApp.configure(with: options)

dla Swift 4.0:

let filePath = Bundle.main.path(forResource: "GoogleService-Info", ofType: "plist")!
let options = FirebaseOptions(contentsOfFile: filePath)
FirebaseApp.configure(options: options!)
Essam Elmasry
źródło
1
Czy z powyższym kodem masz dwa różne GoogleService-Info.plistpliki w różnych lokalizacjach, czy też możesz mieć dwa pliki o różnych nazwach. Czy mógłbyś podać więcej informacji na temat rzeczywistych nazw plików i ich lokalizacji?
Varun Gupta
1
Mam 2 pliki o nazwach GoogleService-Info-dev.plist GoogleService-Info-live.plist ten kod pozwala powiedzieć plik informacyjny aplikacji, z którym chcesz pracować, zamiast domyślnego GoogleService-Info-dev.plist użyj instrukcji warunkowej lub flagi docelowe, aby przełączać się między plikami
Essam Elmasry
tak, w AppDelegate
Essam Elmasry
1
daje mi „Nie można zlokalizować pliku konfiguracyjnego:„ GoogleService-Info.plist ””
orium
W najnowszym dokumencie jest napisane „Ostrzeżenie: to podejście może w pewnych okolicznościach wpłynąć na zbieranie danych w Analytics” firebase.google.com/docs/projects/multiprojects
Shingo Fukuyama
31

Sprawdź ten artykuł: https://medium.com/@brunolemos/how-to-setup-a-different-firebase-project-for-debug-and-release-environments-157b40512164

W Xcode utwórz dwa katalogi wewnątrz projektu: Debugi Release. Umieść GoogleService-Info.plisttam każdy plik.

Na AppDelegate.mwewnątrz didFinishLaunchingWithOptionsmetody, należy umieścić kod:

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

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

Przeciągnij i upuść oba foldery Debugi Releasedo Build Phases > Copy Bundle Resources:

Fazy ​​budowy> Kopiuj zasoby pakietu

Otóż ​​to :)

Bruno Lemos
źródło
1
To zadziałało dla mnie. Musisz dodać te foldery jako odniesienie, w przeciwnym razie rzeczywiście ulegnie awarii. Dzięki!
Eironeia
To rozwiązanie nadal nie rozwiązuje problemu z Analyticsframeworkiem, nie możesz powiedzieć, który .plistjest ładowany.
Lifely
@Bruno Lemos, Czy mogę jednocześnie korzystać z dwóch projektów Firebase z jednego projektu xcode? Nie jako Debug& Release? Ponieważ kiedy próbuję to zrobić, zawsze kończy się na tym, already configured crash.że postępowałem zgodnie z najnowszymi instrukcjami z oficjalnego dokumentu Firebase. Dzięki
Tulon
24

Myślę, że możesz użyć tego sposobu, aby dynamicznie skonfigurować GoogleService-Info.plist i używać różnych nazw dla różnych identyfikatorów pakietów.

ciao Andreas

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"GoogleService-Info" ofType:@"plist"];
FIROptions *options = [[FIROptions alloc] initWithContentsOfFile:filePath];
[FIRApp configureWithOptions:options];
inidona
źródło
5
Z powyższym kodem, czy masz dwa różne pliki GoogleService-Info.plist pliki w różnych lokalizacjach, czy może dwa pliki o różnych nazwach. Czy mógłbyś podać więcej informacji na temat rzeczywistych nazw plików i ich lokalizacji?
Varun Gupta
4
Otrzymuję ten błąd w dzienniku podczas wywołania configureWithOptions:Could not locate configuration file: 'GoogleService-Info.plist'
Babken Vardanyan
14

Zauważyłem, że Google oczekuje, że nazwa pliku to GoogleServiceInfo.plist w kodzie:

 * 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

kluczowe jest to

odczytać z pliku GoogleServices-Info.plist dołączonego do aplikacji docelowej

Więc po prostu skopiowałem ten sam plik i umieściłem go w różnych katalogach i powiązałem z różnymi celami:

wprowadź opis obrazu tutaj

abbood
źródło
Dzięki, bardzo proste i działa bardzo dobrze dla mnie, Xcode 10.1, FirebaseCore (5.3.1)
infinity_coding7
Jak uniknąć błędu „Wiele poleceń generuje”, który występuje później z powodu wielu plików Plist lub innych plików w aplikacji
Wahab Khan Jadon
12

Jeśli GoogleService-Info.plistma inną nazwę, wpłynie to na wyniki analizy. Firebase ostrzeże Cię o tym. https://github.com/firebase/firebase-ios-sdk/issues/230#issuecomment-327138180 . Z tego powodu żadne z tych rozwiązań wykonawczych nie zapewni najlepszych wyników analizy.

Istnieją dwa rozwiązania, które nie zadziałają z Analytics.

  1. Użyj innego celu dla każdego schematu i powiąż każdą wersję GoogleService-Info.plistz własnym celem. Zobacz Członkostwo docelowe w Inspektorze plików po prawej stronie w Xcode. Aby uzyskać więcej informacji, zobacz to pytanie .

  2. Użyj skryptu fazy kompilacji, aby skopiować poprawną wersję programu GoogleService-Info.plistdo katalogu kompilacji. Używam innego identyfikatora pakietu na potrzeby przemieszczania i produkcji. Dzięki temu mogę równolegle zainstalować obie wersje aplikacji. Oznacza to również, że za pomocą poniższego skryptu mogę nazwać moje różne GoogleService-Info.plistpliki za pomocą identyfikatora pakietu. Na przykład:

    • GoogleService-Info-com.example.app.plist
    • GoogleService-Info-com.example.app.staging.plist

Tworzenie skryptu fazy

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"

Uwaga: będziesz musiał zmienić ustawienia, PATH_TO_CONFIGaby dostosować je do swoich potrzeb.

Tworzenie skryptu fazy

Onato
źródło
1
Jak dotąd to najlepsze rozwiązanie. Ponieważ Firebase Crashlytics może używać pliku GoogleService-Info.plist tylko do przesyłania plików dSYM za pomocą skryptu „upload-symbols” - to rozwiązanie działa doskonale!
Alexey Galishnikov
7

Późno, ale myślę, że muszę opublikować tę odpowiedź, aby pomóc nowym programistom. Znalazłem bardzo dobry artykuł, który rozwiązuje mój problem i obiecuję, że może on również pomóc :)
Sprawdź ten artykuł, który również rozwiązuje Twój problem.

Krok 1:
Skopiuj plik GoogleService-Info.plist odpowiadający środowisku programistycznemu Firebase do katalogu Dev . Podobnie skopiuj plik GoogleService-Info.plist odpowiadający środowisku produkcyjnemu Firebase do katalogu Prod . Pamiętaj, aby odznaczyć opcję „W razie potrzeby kopiuj elementy” i wszystkie cele w sekcji „Dodaj do celów” .

(Link do zdjęcia w kroku 1 (nie mogę dodać zdjęcia ze względu na mniejszą reputację))

Krok 2:
W nawigatorze projektu Xcode wybierz miejsce docelowe aplikacji. Przejdź do zakładki Fazy budowy u góry, a następnie dodaj fazę nowego skryptu uruchamiania . Nazwij fazę „Skonfiguruj środowisko Firebase GoogleService-Info.plist” lub nadaj jej nazwę i umieść ją przed krokiem „Kopiuj zasoby pakietu” .

Krok 3:
Zaimplementuj skrypt powłoki, który skopiuje odpowiednią GoogleService-Info.plist do pakietu aplikacji na podstawie konfiguracji kompilacji. Skopiuj i wklej następujący skrypt powłoki do właśnie utworzonej fazy uruchamiania skryptu:

# Name of the resource we're selectively copying
GOOGLESERVICE_INFO_PLIST=GoogleService-Info.plist

# Get references to dev and prod versions of the GoogleService-Info.plist
# NOTE: These should only live on the file system and should NOT be part of the target (since we'll be adding them to the target manually)
GOOGLESERVICE_INFO_DEV=${PROJECT_DIR}/${TARGET_NAME}/Firebase/Dev/${GOOGLESERVICE_INFO_PLIST}
GOOGLESERVICE_INFO_PROD=${PROJECT_DIR}/${TARGET_NAME}/Firebase/Prod/${GOOGLESERVICE_INFO_PLIST}

# Make sure the dev version of GoogleService-Info.plist exists
echo "Looking for ${GOOGLESERVICE_INFO_PLIST} in ${GOOGLESERVICE_INFO_DEV}"
if [ ! -f $GOOGLESERVICE_INFO_DEV ]
then
    echo "No Development GoogleService-Info.plist found. Please ensure it's in the proper directory."
    exit 1
fi

# Make sure the prod version of GoogleService-Info.plist exists
echo "Looking for ${GOOGLESERVICE_INFO_PLIST} in ${GOOGLESERVICE_INFO_PROD}"
if [ ! -f $GOOGLESERVICE_INFO_PROD ]
then
    echo "No Production GoogleService-Info.plist found. Please ensure it's in the proper directory."
    exit 1
fi

# Get a reference to the destination location for the GoogleService-Info.plist
PLIST_DESTINATION=${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app
echo "Will copy ${GOOGLESERVICE_INFO_PLIST} to final destination: ${PLIST_DESTINATION}"

# Copy over the prod GoogleService-Info.plist for Release builds
if [ "${CONFIGURATION}" == "Release" ]
then
    echo "Using ${GOOGLESERVICE_INFO_PROD}"
    cp "${GOOGLESERVICE_INFO_PROD}" "${PLIST_DESTINATION}"
else
    echo "Using ${GOOGLESERVICE_INFO_DEV}"
    cp "${GOOGLESERVICE_INFO_DEV}" "${PLIST_DESTINATION}"
fi
Knight Fighter
źródło
6

Nie możesz uniknąć używania plist w Firebase. Najlepszym rozwiązaniem, jakie do tej pory znalazłem, byłoby dodanie obu plików i nadanie im nazwy

GoogleService-Info_stage.plist

i

GoogleService-Info_prod.plist

Następnie z kodu możesz wywołać właściwy plik. W ten sposób aplikacja nie ulegnie awarii, jeśli nie masz pliku. Wystarczy zamienić FILENAME na GoogleService-Info_prod lub GoogleService-Info_stage.

if let configFile = Bundle.main.path(forResource: "FILENAME", ofType: "plist"), 
    let options = FirebaseOptions(contentsOfFile: configFile)   
{
   FirebaseApp.configure(options: options)
}
pierre23
źródło
Konfiguracje środowiska wykonawczego mogą prowadzić do problemów z raportowaniem analitycznym, jak wspomniano w dokumentacji .
Alex
3

To jest moje rozwiązanie!

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

I to wszystko!

Ignacio Hernández
źródło
3

Ta odpowiedź jest bardzo zainspirowana odpowiedzią @abbood , ale jest nieco bardziej szczegółowa, jak to zrobić.

Dla każdego celu, np. Dev, stg, prod:

  • Pobierz odpowiedni GoogleService-Info.plistdo osobnego folderu o nazwie docelowej
  • W Xcode kliknij prawym przyciskiem myszy folder aplikacji i wybierz Add files to "your app" wprowadź opis obrazu tutaj
  • Wybierz folder zawierający docelowego GoogleService-Info.plist, upewnij się, Copy items if neededi Create groupssą wybrane, sprawdź tylko odpowiedni cel z listy celów, a następnie naciśnijAdd wprowadź opis obrazu tutaj

Otóż ​​to. Teraz powinieneś mieć coś podobnego do tej struktury

wprowadź opis obrazu tutaj

Kiedy zbudujesz cel, GoogleService-Info.plistzostanie użyty właściwy .

Bjørn Egil
źródło
U mnie zadziałało idealnie.
Şafak Gezer
2

Oto jak to zrobić w Xamarin C #:

string plistPath = NSBundle.MainBundle.PathForResource ("GoogleService-Info", "plist");
Options options = new Options (plistPath);
App.Configure (options);

Pamiętaj o uwzględnieniu przestrzeni nazw Firebase:

using Firebase.Analytics;
Sune Kjærgård
źródło
1

Myślę, że nie da się tego osiągnąć bez użycia GoogleService-Info.plist.Ponieważ zanim zaczniesz integrować swoją aplikację na iOS z komponentami Google Sign-In, musisz pobrać zależności i skonfigurować swój projekt Xcode. Ten proces pokazuje, że GoogleService-Info.plistma na to duży wpływ.

Tak więc rozwiązania i pomysł w tym pytaniu SO mogą pomóc w rozwiązaniu problemu. Właśnie przeniosłem główną kopię plikuGoogleService-Info plist aplikacji do 2 oddzielnych folderów, a następnie skorzystałem z funkcji „Kopiuj pliki” w fazach kompilacji na każdym miejscu docelowym, aby zaimportować docelową listę docelową do folderu Zasoby.

Sprawdź również to pytanie SO , może dać ci więcej informacji / pomysłów na twój problem.

KENdi
źródło
Czy w tym przypadku target oznacza inny schemat dla tego samego projektu? Po przeczytaniu pytań doszedłem do wniosku, że cel oznacza zupełnie inny cel kompilacji, a nie tylko inny schemat kompilacji dla tego samego celu.
Varun Gupta
1
Ale co, jeśli masz jeden cel z inną konfiguracją dla każdego schematu?
evya,
1

W Xcode 9.2 potrzebowałem plików dla obu celów, które miały nazywać się „googleServiceInfo.plist”, ale były umieszczone w różnych katalogach, z katalogiem / plikiem dla każdego celu określonym w „Fazy kompilacji”, „Kopiuj zasoby pakietu”.

Powyższe nie było moim ulubionym rozwiązaniem, ale wcześniej próbowałem używać różnych nazw plików zgodnie z odpowiedzią @ inidona, przekonwertowanych na Swift 4:

 let filePath = Bundle.main.path(forResource: "googleServiceInfo-Pro", ofType: "plist")!
 let options = FirebaseOptions(contentsOfFile: filePath)
 FirebaseApp.configure(options: options!)

Niestety nie poprawiło to komunikatów o błędach Firebase. W tym pytaniu: Firebase iOS SDK - użycie pliku konfiguracyjnego innego niż GoogleService-Info.plist generuje ostrzeżenie konsoli, że oryginalny plakat został naprawiony poprzez aktualizację Firebase Pod, ale nie potwierdziłem tego.

djruss70
źródło
1

Rozwiązałem to w ten sposób:

    #if STAGING
        if let filePath = Bundle.main.path(forResource: "GoogleService-Info-Dev", ofType: "plist"),
            let options = FirebaseOptions(contentsOfFile: filePath) {
                FirebaseApp.configure(options: options)
        } else {
            fatalError("GoogleService-Info-Dev.plist is missing!")
        }
    #else
        if let filePath = Bundle.main.path(forResource: "GoogleService-Info", ofType: "plist"),
            let options = FirebaseOptions(contentsOfFile: filePath) {
                FirebaseApp.configure(options: options)
        } else {
            fatalError("GoogleService-Info.plist is missing!")
        }
    #endif
Arafin Russell
źródło
1

Jeśli ktoś z was popadnie w błąd i Xcode narzeka

„Wiele poleceń tworzy GoogleService-Info.plist”

po zastosowaniu odpowiedzi @Knight Fighter możesz chcieć:

  • Sprawdź Fazy ​​budowy> Kopiuj zasoby pakietu
  • Filtruj według plików o nazwach GoogleService-Info.plist
  • Usuń wszelkie odniesienia do niego, ponieważ jest już kopiowany za pośrednictwem skryptu.
Luiz Dias
źródło
0

Zastanawiałem się więc nad tym samym pytaniem i wykorzystałem kilka pomysłów z wcześniejszych postów, z których niektóre publikują aplikacje GoogleServices-Info.plistdla wszystkich środowisk we wszystkich aplikacjach i jest to trochę niepokojące.

Wymyśliłem rozszerzalne rozwiązanie, które kopiuje GoogleSerives-Info.plistplik w czasie kompilacji. Co więcej, to podejście może obsługiwać dowolną liczbę środowisk z możliwością dostosowywania i jest zgodne z prostą konwencją, co ułatwia zarządzanie.

Przede wszystkim mam trzy środowiska debug(do uruchamiania w symulatorze i urządzeniu do debugowania i aktywnego cięcia kodu), staging(do wdrożenia w celu przetestowania lotu) i releasedo produkcji.

Krok pierwszy to utworzenie konfiguracji:

wprowadź opis obrazu tutaj

Wybierz „Produkt” -> „Schemat” -> „Edytuj schemat” i skopiuj / utwórz nowy zgodnie z wymaganiami. Przejdź przez każdy schemat i przypisz jego odpowiednią konfigurację z listy rozwijanej „Konfiguracja kompilacji” w każdej z kategorii:

wprowadź opis obrazu tutaj

Idę o krok dalej i odznaczam opcję „uruchom” dla schematów, które mają być dystrybuowane, tj. Wydawania i przemieszczania, i odwrotnie, odznaczam opcję „archiwizuj” w celu debugowania. Powinieneś zrobić to, co ma dla ciebie sens.

wprowadź opis obrazu tutaj

W fazach kompilacji dodaj następujący skrypt uruchamiania ( CONFIGURATIONS_FOLDERzmienną można dostosować według potrzeb - po prostu upewnij się, że używasz tej samej nazwy folderu w następnym kroku):

# Get a reference to the folder which contains the configuration subfolders.
CONFIGURATIONS_FOLDER=Firebase
# Get a refernce to the filename of a 'GoogleService-Info.plist' file.
GOOGLESERVICE_INFO_PLIST=GoogleService-Info.plist
# Get a reference to the 'GoogleService-Info.plist' for the current configuration.
GOOGLESERVICE_INFO_PLIST_LOCATION=${PROJECT_DIR}/${TARGET_NAME}/${CONFIGURATIONS_FOLDER}/${CONFIGURATION}/${GOOGLESERVICE_INFO_PLIST}
# Check if 'GoogleService-Info.plist' file for current configuration exist.
if [ ! -f $GOOGLESERVICE_INFO_PLIST_LOCATION ]
then
  echo "No '${GOOGLESERVICE_INFO_PLIST}' file found for the configuration '${CONFIGURATION}' in the configuration directory '${PROJECT_DIR}/${TARGET_NAME}/${CONFIGURATIONS_FOLDER}/${CONFIGURATION}'."
  exit 1
fi
# Get a reference to the destination location for the GoogleService-Info.plist.
GOOGLESERVICE_INFO_PLIST_DESTINATION=${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app
# Copy 'GoogleService-Info.plist' for current configution to destination.
cp "${GOOGLESERVICE_INFO_PLIST_LOCATION}" "${GOOGLESERVICE_INFO_PLIST_DESTINATION}"
echo "Successfully coppied the '${GOOGLESERVICE_INFO_PLIST}' file for the '${CONFIGURATION}' configuration from '${GOOGLESERVICE_INFO_PLIST_LOCATION}' to '${GOOGLESERVICE_INFO_PLIST_DESTINATION}'."

wprowadź opis obrazu tutaj

W wybranym folderze konfiguracji („Firebase” w powyższym przykładzie) zagnieźdź foldery dla każdej konfiguracji o dokładnie takiej samej nazwie, jak jej odpowiednia konfiguracja (z uwzględnieniem wielkości liter), w których umieść odpowiednie GoogleServices-Info.plistpliki w następujący sposób:

wprowadź opis obrazu tutaj

Wreszcie, chciałbym również upewnić się, że poziom główny GoogleServices-Info.plistnie zostanie dodany do projektu przez przypadek, więc dodaję następujący plik do mojego .gitignore.

# Ignore project level GoogleService-Info.plist
/[Project Name]/GoogleService-Info.plist
Sagar Patel
źródło
0

Załóżmy, że mamy zestaw dwóch konfiguracji developi production. Musisz zrobić dwie rzeczy:

  1. Zmień nazwę obu plists, aby były zgodne z podaną konfiguracją:
  • GoogleService-Info-develop.plist
  • GoogleService-Info-production.plist
  1. Dodaj skrypt uruchamiania, który kopiuje poprawną listę plist dla wybranej konfiguracji:
FIREBASE_PLIST_PATH="${PROJECT_DIR}/App/Resources/Plists/GoogleService-Info-${CONFIGURATION}.plist"
echo "Firebase plist path: ${FIREBASE_PLIST_PATH}"
cp -r ${FIREBASE_PLIST_PATH} "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist"

Skrypt uruchamiania należy umieścić przed FirebaseCrashlyticsskryptem.

Możesz zainicjować firebase tak jak wcześniej dla pojedynczego schematu: FirebaseApp.configure()

Borut Tomazin
źródło