Различное имя приложения в зависимости от конфигурации, когда имя приложения локализовано в InfoPlist.strings

Мы используем настройки с различными списками для каждой конфигурации. Как это:Target-Info-Dev.plist, Target-Info-Beta.plist...

Таким образом, наши конфигурации могут иметь свое собственное CFBundleDisplayName, и мы можем различать сборки по имени приложения на устройстве. Например: "DEV Appname", "BETA Appname"...

Однако теперь нам необходимо локализовать имя приложения. Мы сделали это, создав локализованные строки InfoPlist.strings для каждой цели:

"CFBundleDisplayName" = "<localized-appname>";
"CFBundleName" = "<localized-appname>";

Но поскольку CFBundleDisplayName больше не является производным от Target-Info- [Configuration].plist, мы не можем дифференцировать имя приложения для разных конфигураций.

Следует отметить, что у нас есть несколько целей для разных брендов одного и того же приложения, но мы уже добились этого, имея отдельные строки InfoPlist.strings для каждой цели.

У кого-нибудь есть идея, как получить как локализованное, так и основанное на конфигурации имя приложения?

3 ответа

Решение

Лучшее решение

  1. Изменить Info.plist, установить CFBundleDisplayNameзначение переменной с именем что-то вроде $(MY_DISPLAY_NAME)

  1. Откройте вкладку " Настройки сборки" проекта или цели, добавьте ключ с именем MY_DISPLAY_NAME в разделе User-Defined (вам нужно прокрутить до конца, чтобы найти этот раздел), затем просто разверните вновь добавленный ключ и задайте любое имя для каждой конфигурации, как вы хотите.

При создании проекта каждая переменная в Info.plist будет заменена на ее значение.

Решение намного проще, чем оригинальное.

Оригинальное решение

У меня было такое же требование в моем проекте, и затем я нашел ваш вопрос, и наконец я решил его. Отредактируйте схему своих проектов, добавьте сценарий до и после действия, чтобы выполнить изменения. Как это,

Шаг 1. измените имя приложения в Pre-действиях Build

str=""
if [ "${CONFIGURATION}" == "Debug" ];then
    str="dev"
elif [ "${CONFIGURATION}" == "AdhocDevelopment" ];then
    str="dev"
elif [ "${CONFIGURATION}" == "AdhocDistribution" ];then
    str="adhoc"
elif [ "${CONFIGURATION}" == "DailyBuild" ];then
    str="rdm"
fi
perl -pi -e "s/appName[^<]*/appName${str}/g" ${PROJECT_DIR}/smd/Info.plist

Шаг 2. Восстановите имя приложения в пост-действиях Build

perl -pi -e "s/appName[^<]*/appName/g" ${PROJECT_DIR}/smd/Info.plist
echo ${PROJECT_DIR}/${INFOPLIST_FILE} > ~/tmp.txt; rm -f ~/tmp.txt

Что-то для объяснения: Debug/AdhocDevelopment/AdhocDistribution/DailyBuild - это имена конфигурации ваших проектов; ${CONFIGURATION} предопределен Xcode; Perl предпочтительнее awk и sed, которые все предустановлены на каждом Mac OS X.

Кстати, я изменил appName в Info.plist, вы можете изменить ваши infoPlist.strings. Таким образом, вам просто нужен один файл Info.plist.

Поскольку файл представляет собой не просто один файл, а распределен по нескольким папкам и файлам, например: en.lproj/InfoPlist.strings, de.lproj/InfoPlist.strings. Немного сложнее использовать для разных схем. Вот как я локализовал имя виджета «Сегодня», разделяемого двумя разновидностями / схемами одной и той же цели. В демонстрационных целях я использовал 2 «вкуса»: и. Я обращусь к ним в этом ответе.

Шаг 1:

  • Создайте папки для каждого «вкуса» или схемы в целевом каталоге. Назовите каждую папку точно так, как они названы в вашем user-definedсхема. Скопируйте туда файл.

Этот шаг может оказаться непростым. Что я сделал: я создал новую папку в XCode и назвал ее. Я перетащил туда свой файл, затем перешел к этой папке в Finder, продублировал эту папку и переименовал ее в. Затем я перетащил его в XCode. Не добавляйте его ни к какой цели. Это не нужно.

Шаг 2:

  • Удалите из фазы сборки цели:

Щелкните имя своего проекта -> Выберите цель виджета (например, виджет Сегодня) -> перейдите к Build Phases -> откройте Copy Bundle Resources -> найдите файл, выберите его и нажмите Delete кнопка

Шаг 3:

  • Добавьте новый сценарий запуска, чтобы скопировать правильный файл

Вот сценарий, который я придумал, который скопирует правильный файл в зависимости от текущего варианта / схемы, которую сейчас запускает ваше приложение:

      for lng in en de es fr it nl pt-PT tr
do
  INFO_PLIST_FILE="${PROJECT_DIR}/TodayMatchesWidget/${APP_FLAVOR}/${lng}.lproj/InfoPlist.strings" 
  BUILD_APP_DIR="${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}" 
  FILE_LOCATION="${BUILD_APP_DIR}/${lng}.lproj/InfoPlist.strings" 
  cp "${INFO_PLIST_FILE}" "${FILE_LOCATION}"
done

Это цикл for, который проходит через все мои языки локализации. Вам нужно поместить туда только те языки, которые вы поддерживаете. Аббревиатуры каждого языка следует отделять пробелом, больше ничего.

Единственная переменная, о которой вам нужно позаботиться, это APP_FLAVOR, который в моем случае является пользовательской настройкой внутри проекта Build Settings, и в моем случае будет либо TA или же EC.

Вот окончательная структура папок в папке Today Widget:

PS: Я предполагаю, что у вас уже есть файл в целевом каталоге. Если нет, просто добавьте новый Strings File и назови это InfoPlist.strings и добавьте это значение внутрь:

CFBundleDisplayName = "My Localized Widget";

Надеюсь, это поможет кому-нибудь!

Вот как вы можете иметь разные InfoPlist.strings для разных конфигураций сборки в одной и той же цели, используя только параметры сборки и несколько дубликатов файлов Info.plist.

  1. В настройках сборки:
    • Укажите другой файл Info.plist (INFOPLIST_FILE)для каждой конфигурации.
    • Установите имена файлов корректировки строк для Info.plist (STRINGS_FILE_INFOPLIST_RENAME) к . В Xcode 14 он был установлен наYesпо умолчанию.
  2. Создавать.stringsфайлы сbase name of your Info.plist filename+Plist.strings.
    • Например, если ваше имя файла Info.plistBeta-Info.plist, ваш файл строк должен иметь имяBeta-InfoPlist.strings. Убедитесь, что вы включили все эти строковые файлы в свой файл build.
  3. Не включайтеInfoPlist.stringsфайл в вашей цели.

Ключом к выполнению этой работы является Настройка имен файлов строк для Info.plist в Справочнике по параметрам сборки .

Настройте имена строковых файлов для Info.plist.
Название настройки:STRINGS_FILE_INFOPLIST_RENAME

Если включено, переименовывает файлы .strings, чье базовое имя совпадает с именем целевого файла Info.plist, в InfoPlist.strings в собранном продукте.

Пример

Вот пример моего приложения, которое имеет 3 разных варианта (AdSupported, AdSupported-Dev, Pro), для которых требуются разные имена приложений.

  1. Настройки сборки.

  1. Файлы строк. Все они включены в мою цель.

  1. Информационные файлы plist. Как обычно, они указаны в настройках сборки и НЕ включены в мою цель.

Другие вопросы по тегам