Подтвердить что ты не робот

Используйте различные сервисы GoogleService-Info.plist для разных схем сборки

Я использую схему сборки для prod и одну для постановки (с двумя разными идентификаторами пакета), и я пытаюсь использовать отдельный файл GoogleService-Info.plist для каждой схемы. Есть ли способ вручную выбрать файл plist для использования при инициализации GCM (и goole login)? Или возможно ли избежать использования plist и выполнить настройку вручную?

Спасибо!

4b9b3361

Ответ 1

Подробнее

Проверено на:

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

Решение

  1. Создайте папку со всеми вашими файлами Google.plist (с разными именами) в проекте

enter image description here

  1. Добавить скрипт запуска

enter image description here

Не забудьте изменить значение PATH_TO_GOOGLE_PLISTS value

Код

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

Построить схемы имен

enter image description here

Ответ 2

Ответ @inidona работал у меня. После того, как я преобразовал его в Swift

для Swift 2.3:

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

для Swift 3.0:

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

для Swift 4.0:

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

Ответ 3

Я думаю, вы можете использовать этот способ для динамического конфигурирования своего GoogleService-Info.plist и использования разных имен для разных идентификаторов пакетов.

чао Andreas

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"GoogleService-Info" ofType:@"plist"];
FIROptions *options = [[FIROptions alloc] initWithContentsOfFile:filePath];
[FIRApp configureWithOptions:options];

Ответ 4

Проверьте эту статью: https://medium.com/@brunolemos/how-to-setup-a-different-firebase-project-for-debug-and-release-environments-157b40512164

В Xcode создайте две директории внутри вашего проекта: Debug и Release. Поместите GoogleService-Info.plist каждый GoogleService-Info.plist.

На AppDelegate.m, внутри метода didFinishLaunchingWithOptions, поместите код:

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)

Перетащите папки Debug и Release в Build Phases > Copy Bundle Resources:

Build Phases > Copy Bundle Resources

Это :)

Ответ 5

Я заметил, что Google ожидает, что имя файла будет GoogleServiceInfo.plist в коде:

 * 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

ключевая фраза это

читать из файла GoogleServices-Info.plist в комплекте с целевым приложением

Поэтому я просто скопировал один и тот же файл и поместил его в разные каталоги, и привязал его к разным целям:

enter image description here

Ответ 6

Если GoogleService-Info.plist имеет другое имя, это повлияет на ваши результаты аналитики. Firebase предупредит вас об этом. https://github.com/firebase/firebase-ios-sdk/issues/230#issuecomment-327138180. По этой причине ни одно из этих решений времени выполнения не даст наилучших результатов аналитики.

Есть два решения, которые не будут связываться с Google Analytics.

  1. Используйте разные цели для каждой схемы и свяжите каждую версию GoogleService-Info.plist со своей целью. См. Целевое членство в Инспекторе файлов с правой стороны в XCode. Для получения дополнительной информации Смотрите этот вопрос.

  2. Используйте сценарий фазы сборки, чтобы скопировать правильную версию из GoogleService-Info.plist в каталог сборки. Я использую другой идентификатор комплекта для постановки и производства. Это позволяет мне установить обе версии приложения параллельно. Это также означает, что с помощью приведенного ниже сценария я могу назвать свои разные файлы GoogleService-Info.plist с помощью идентификатора пакета. Например:

    • 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"

Примечание. Вам придется изменить PATH_TO_CONFIG в соответствии с вашими настройками.

Build Phase Script

Ответ 7

Вы не можете избежать использования списка с Firebase. Лучшее решение, которое я нашел для вас, это добавить оба файла и назвать его

GoogleService-Info_stage.plist

и

GoogleService-Info_prod.plist

Тогда из вашего кода вы можете вызвать правильный файл. Этот способ не приведет к сбою приложения, если у вас нет файла. Просто замените FILENAME на GoogleService-Info_prod или GoogleService-Info_stage.

if let configFile = Bundle.main.path(forResource: "FILENAME", ofType: "plist"), 
    let options = FirebaseOptions(contentsOfFile: configFile)   
{
   FirebaseApp.configure(options: options)
}

Ответ 8

Вот как это сделать в Xamarin С#:

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

Не забудьте включить пространство имен Firebase:

using Firebase.Analytics;

Ответ 9

Это мое решение!

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

И что это!

Ответ 10

Я думаю, что это невозможно достичь без использования GoogleService-Info.plist.. Прежде чем вы сможете начать интегрировать приложение iOS с компонентами входа в Google, вы должны загрузить зависимости и настроить свой проект Xcode. И этот процесс показывает, что GoogleService-Info.plist имеет большой фактор на нем.

Таким образом, решения и идея здесь в этом вопросе SO могут помочь вам в решении вашей проблемы. Просто перетащил основную копию GoogleService-Info plist из приложения в 2 отдельные папки, а затем использовал "Скопировать файлы" на каждой фазе, чтобы импортировать целевой конкретный plist в папку "Ресурсы" .

Также проверьте этот вопрос SO, это может дать вам больше информации/идеи для вашей проблемы.

Ответ 11

С Xcode 9.2 мне нужны файлы для обеих целей, которые будут называться "googleServiceInfo.plist", но помещены в разные каталоги, с каталогом/файлом для каждой цели, указанной в "Фазах сборки", "Копировать ресурсы Bundle".

Вышеупомянутое не было моим предпочтительным решением, но я ранее пытался использовать разные имена файлов по строкам ответа @inidona, преобразованные в Swift 4:

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

К сожалению, это не исправило сообщения об ошибках Firebase. В этом вопросе: Firebase iOS SDK. Использование конфигурационного файла, отличного от GoogleService-Info.plist, генерирует предупреждение консоли. Оригинальный плакат, по-видимому, исправлен обновлением Firebase Pod, но у меня есть не подтвердил это.