Как изменить $ (PRODUCT_BUNDLE_IDENTIFIER) в Xcode? - PullRequest
0 голосов
/ 03 февраля 2019

Я создаю разные версии приложения Flutter с другой средой Firebase (разработка и производство).Мне нужно установить разные идентификаторы комплекта для разработки и производства в Xcode для приложений iOS.

Я использую схемы для настройки различных вариантов (в настройках сборки я добавляю значение среды для каждой конфигурации).

Но у меня есть большая проблема с изменением $(PRODUCT_BUNDLE_IDENTIFIER).Мне нужно добавить суффикс .development к обычному идентификатору приложения для идентификатора приложения разработки.

Я попробую следовать этому методу (использовать пользовательские настройки) и изменить info.plist, чтобы получить переменную от пользователяЗаданные настройки, но они не работают.

Ошибка:

Операция не может быть завершена.Приложение «$ (EXAMPLE_BUNDLE_ID)» неизвестно FrontBoard.

Так что кажется, что при переходе в пользовательские настройки он не интерполирован правильно.

Я также попробовал метод смешивания addпо умолчанию PRODUCT_BUNDLE_IDENTIFIER и пользовательские настройки, например: com.example.app$(EXAMPLE_BUNDLE_ID) где EXAMPLE_BUNDLE_ID = .development

Я также пытаюсь ссылаться на пользовательскую настройку $(EXAMPLE_BUNDLE_ID) путем непосредственного добавления ее в идентификатор пакета на вкладке "Общие" цели.в «Идентичность». Но это затем изменить на: -- EXAMPLE_BUNDLE_ID-

Я также попытался в info.plist использовать $(PRODUCT_BUNDLE_IDENTIFIER)$(EXAMPLE_BUNDLE_ID) для значения идентификатора пакета. Но это дает похожую ошибку:

Операция не может быть завершена. Приложение "com.example.app $ (EXAMPLE_BUNDLE_ID)" неизвестно FrontBoard.

Снова это похоже на проблему с интерполяцией.

Anyoneзнаете решение?Я смотрю, но не могу найти ответ.

Это легко для Android, потому что просто используйте applicationIdSuffix ".development” в productFlavors.Но я не могу найти способ, как это для Xcode.

1 Ответ

0 голосов
/ 04 февраля 2019

Вам нужны разные package name (Android) и bundle id (iOS), потому что вам нужно использовать плагин Firebase Auth?

В этом случае для проекта iOS вы должны рассмотреть возможность использования PlistBuddy, и вы можете установить его, добавив Run Script в ваш XCode build phases как этот

if [ "${CONFIGURATION}" = "Debug" ]; then
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier com.example.developmento.appName" "$PROJECT_DIR/Runner/Info.plist"
echo "Changed bundle id for developement $PROJECT_DIR/Runner/Info.plist"
else
echo "Nothing to do"
fi

enter image description here

В любом случае, если вы не используете Firebase Auth, у вас может быть один и тот же идентификатор пакета в разных проектах Firebase.

Если вам нужно, чтобы дифференцировать файл проектов Firebase между этапамии производство, вы можете посмотреть здесь:

Как выбрать между разработкой и производственным проектом Firebase, основанным на вариантах сборки?

ОБНОВЛЕНИЕ

Итак, после OP-чата, зная, что он следует этому учебнику , чтобы настроить flutter flavors Я попытался понять, где мы застряли.

Отправной точкой является следующее:

  • Два Firebase project
  • Использование модуля Firebase Auth (поэтому необходимо изменить идентификатор пакета между проектами)
  • И, конечно, два разных GoogleService-Info.plist

Я начинаю с Xcode bundle id и GoogleService-Info.plist, настроенных на продуктИон (просто опция)

enter image description here

Затем я сохраняю и GoogleServices-Info-staging.plist, и GoogleServices-Info-production.plist, сохраняю в своей папке ios / Runner

enter image description here

Затем я установил этот сценарий сборки перед сценарием для Compile Sources

# Type a script or drag a script file from your workspace to insert its path.
if [ "${CONFIGURATION}" == "Debug" ] || [ "${CONFIGURATION}" == "Debug-Runner-staging" ]; then 

echo "Setting up staging firebase environment"
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier com.example.staging.flutterAppAuthFlavours" "${PROJECT_DIR}/Runner/Info.plist"
cp -r "${PROJECT_DIR}/Runner/GoogleService-Info-staging.plist" "${PROJECT_DIR}/Runner/GoogleService-Info.plist" 
echo "$(date) staging flavour - Configuration: ${CONFIGURATION}" > "${PROJECT_DIR}/environment.txt"

elif [ "${CONFIGURATION}" == "Debug-Runner-production" ]; then 

echo "Setting up production firebase environment"
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier com.example.flutterAppAuthFlavours" "${PROJECT_DIR}/Runner/Info.plist" 
cp -r "${PROJECT_DIR}/Runner/GoogleService-Info-production.plist" "${PROJECT_DIR}/Runner/GoogleService-Info.plist"
echo "$(date) production flavour - Configuration:  ${CONFIGURATION}" > "${PROJECT_DIR}/environment.txt"

fi

И я назвал его Setup Firebase Environment (вы можетеназывайте это как хотите)

enter image description here

Этот сценарий также хранит некоторые журналы (с отметкой времени) в файле с именем environment.txt внутри папки ios вЧтобы легко проверить, что сделала сборка xcode

enter image description here

А теперь о Schemes и Build Configurations:

У меня естьсделано два Build Configuration, которые являются точной копией моего Debug Build Configuration, и я назвал их

enter image description here

  • Debug-Runner-staging
  • Debug-Runner-production

Практическое правило заключается в том, чтобы назвать конфигурации сборки как 'Debug-<your flavor>', и вам необходимо иметь схему для каждого варианта у вас есть, поэтому у меня есть эти:

  • Runner-staging чей Run вызывает отладка-Runner-staging build configuration
  • Runner-production, чьи вызовы Run Debug-Runner-production конфигурация сборки

enter image description here

enter image description here

Так что теперь, если я позвоню flutter run --flavor Debug-staging, у меня будет сборка, которая запускается в моем staging firebase проекте.

и если яcall flutter run --flavor Debug-production У меня есть сборка, которая выполняется на моем проекте firebase.

enter image description here

enter image description here

ОБНОВЛЕНИЕ 2

Просто для полноты вы можете изменить идентификатор пакета также здесь:

enter image description here

В любом случае кажется, что странное поведение , что когда вы строите flavour во второй раз flutter, команда правильно строит аромат, но запускает предыдущие версии.build flavor .

При сборке с XCode и переключении со схемами все работает как положено (даже запуск правильного приложения) Я предполагаю, что это может быть проблема с командой флаттера.Поэтому я предлагаю вам попытаться подать проблему здесь , ссылающуюся также на этот ТАК вопрос / ответ.

ОБНОВЛЕНИЕ 3

После небольшого количества информации об интеллекте я обнаружил, что flutter tools устанавливает среду запуска приложения перед сборкой проекта.Поэтому, когда мы изменяем CFBundleIdentifier внутри Info.plist в первый раз, во второй раз, когда мы запускаем flutter run, он принимает предыдущее измененное значение и пытается запустить этот идентификатор пакета, в то время как во время сборки мы меняем его, потому что мы строим другой вариант.

Возможным решением может быть запуск сценария , который изменяет CFBundleIdentifier внутри Info.plist перед вызовом fluetter run.

Например, начиная с Info.plist с идентификатором производственного комплекта com.example.flutterAppAuthFlavours мы могли бы сделать что-то подобное

enter image description here

enter image description here

Здесь я использовал команду sed только для того, чтобы думать иначе, но вы могли бы всегда вызывать наш ниже PlistBuddy, чтобы внести изменения перед вызовом flutter run.

...