Различное имя приложения в зависимости от конфигурации, когда имя приложения локализовано в 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 ответа
Лучшее решение
- Изменить Info.plist, установить
CFBundleDisplayName
значение переменной с именем что-то вроде$(MY_DISPLAY_NAME)
- Откройте вкладку " Настройки сборки" проекта или цели, добавьте ключ с именем
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.
- В настройках сборки:
- Укажите другой файл Info.plist
(INFOPLIST_FILE)
для каждой конфигурации. - Установите имена файлов корректировки строк для Info.plist (
STRINGS_FILE_INFOPLIST_RENAME
) к . В Xcode 14 он был установлен наYes
по умолчанию.
- Укажите другой файл Info.plist
- Создавать
.strings
файлы сbase name of your Info.plist filename
+Plist.strings
.- Например, если ваше имя файла Info.plist
Beta-Info.plist
, ваш файл строк должен иметь имяBeta-InfoPlist.strings
. Убедитесь, что вы включили все эти строковые файлы в свой файл build.
- Например, если ваше имя файла Info.plist
- Не включайте
InfoPlist.strings
файл в вашей цели.
Ключом к выполнению этой работы является Настройка имен файлов строк для Info.plist в Справочнике по параметрам сборки .
Настройте имена строковых файлов для Info.plist.
Название настройки:STRINGS_FILE_INFOPLIST_RENAMEЕсли включено, переименовывает файлы .strings, чье базовое имя совпадает с именем целевого файла Info.plist, в InfoPlist.strings в собранном продукте.
Пример
Вот пример моего приложения, которое имеет 3 разных варианта (AdSupported, AdSupported-Dev, Pro), для которых требуются разные имена приложений.
- Настройки сборки.
- Файлы строк. Все они включены в мою цель.
- Информационные файлы plist. Как обычно, они указаны в настройках сборки и НЕ включены в мою цель.