Xcode добавляет тире к моему идентификатору пакета

Кажется, я не понимаю, как это расхождение. Мое приложение называется Monsters! Таким образом, в plist идентификатор Bundle имеет

com.businessname.${PRODUCT_NAME:rfc1034identifier}

из того, что я понимаю :rfc1034identifier удаляет запрещенные символы из идентификатора Bundle, в моем случае ! в конце Monsters!

Но по какой-то причине, когда я перехожу к своим настройкам проекта, Xcode дает мне идентификатор Bundle

com.businessname.Monsters-

Я понимаю, что могу войти в plist и просто записать свой идентификатор Bundle, но кто-нибудь знает, где и почему добавляется -?

Ответ 1

Разрешенные символы для идентификатора пучка те же, что и у DNS. Поэтому вы не можете помещать пробелы, кавычки и т.д. Для вашей ситуации, в частности, я считаю, что лучшая идея состоит в том, чтобы вручную отредактировать идентификатор пакета с действительным идентификатором вместо использования имени продукта.

В соответствии с Apple doc:

Эта строка должна быть идентификатором единого типа (UTI), который содержит только алфавитно-цифровые (A-Z, a-z, 0-9), дефис (-) и период (.).

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

Ответ 2

Xcode заменяет плохой символ символом не плохого. Они произвольно выбрали -.

Вместо использования ${PRODUCT_NAME:rfc1034identifier} я бы определил новый параметр со значением, являющимся вашим именем продукта, без ! и вместо него использовать его.

Перейдите в настройки своего проекта, а в разделе "Настройки сборки" должен быть раздел "Пользовательский". Добавьте новую настройку, нажав кнопку "+" наверху, где он говорит "Основные все | Комбинированные уровни | +". Назовите его PRODUCT_NAME_SAFE и присвойте ему значение Monsters. Затем установите для параметра Bundle ID значение com.businessname.${PRODUCT_NAME_SAFE}.

Возможно, существуют и другие варианты этого решения, которые будут работать в зависимости от ваших потребностей.