Ответ 1
На основе ответа baptrs я разработал эту оболочку script, которая координирует все мои фреймворки и другие двоичные ресурсы/вспомогательные исполняемые файлы (в настоящее время поддерживаемые типы: dylib, bundle и login):
#!/bin/sh
# WARNING: You may have to run Clean in Xcode after changing CODE_SIGN_IDENTITY!
# Verify that $CODE_SIGN_IDENTITY is set
if [ -z "${CODE_SIGN_IDENTITY}" ] ; then
echo "CODE_SIGN_IDENTITY needs to be set for framework code-signing!"
if [ "${CONFIGURATION}" = "Release" ] ; then
exit 1
else
# Code-signing is optional for non-release builds.
exit 0
fi
fi
if [ -z "${CODE_SIGN_ENTITLEMENTS}" ] ; then
echo "CODE_SIGN_ENTITLEMENTS needs to be set for framework code-signing!"
if [ "${CONFIGURATION}" = "Release" ] ; then
exit 1
else
# Code-signing is optional for non-release builds.
exit 0
fi
fi
ITEMS=""
FRAMEWORKS_DIR="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
if [ -d "$FRAMEWORKS_DIR" ] ; then
FRAMEWORKS=$(find "${FRAMEWORKS_DIR}" -depth -type d -name "*.framework" -or -name "*.dylib" -or -name "*.bundle" | sed -e "s/\(.*framework\)/\1\/Versions\/A\//")
RESULT=$?
if [[ $RESULT != 0 ]] ; then
exit 1
fi
ITEMS="${FRAMEWORKS}"
fi
LOGINITEMS_DIR="${TARGET_BUILD_DIR}/${CONTENTS_FOLDER_PATH}/Library/LoginItems/"
if [ -d "$LOGINITEMS_DIR" ] ; then
LOGINITEMS=$(find "${LOGINITEMS_DIR}" -depth -type d -name "*.app")
RESULT=$?
if [[ $RESULT != 0 ]] ; then
exit 1
fi
ITEMS="${ITEMS}"$'\n'"${LOGINITEMS}"
fi
# Prefer the expanded name, if available.
CODE_SIGN_IDENTITY_FOR_ITEMS="${EXPANDED_CODE_SIGN_IDENTITY_NAME}"
if [ "${CODE_SIGN_IDENTITY_FOR_ITEMS}" = "" ] ; then
# Fall back to old behavior.
CODE_SIGN_IDENTITY_FOR_ITEMS="${CODE_SIGN_IDENTITY}"
fi
echo "Identity:"
echo "${CODE_SIGN_IDENTITY_FOR_ITEMS}"
echo "Entitlements:"
echo "${CODE_SIGN_ENTITLEMENTS}"
echo "Found:"
echo "${ITEMS}"
# Change the Internal Field Separator (IFS) so that spaces in paths will not cause problems below.
SAVED_IFS=$IFS
IFS=$(echo -en "\n\b")
# Loop through all items.
for ITEM in $ITEMS;
do
echo "Signing '${ITEM}'"
codesign --force --verbose --sign "${CODE_SIGN_IDENTITY_FOR_ITEMS}" --entitlements "${CODE_SIGN_ENTITLEMENTS}" "${ITEM}"
RESULT=$?
if [[ $RESULT != 0 ]] ; then
echo "Failed to sign '${ITEM}'."
IFS=$SAVED_IFS
exit 1
fi
done
# Restore $IFS.
IFS=$SAVED_IFS
- Сохраните файл в своем проекте. Я сохраняю свою копию в подкаталоге
Scripts
в моем проекте root.- Моя называется
codesign-frameworks.sh
.
- Моя называется
- Добавьте фазу сборки "Запуск Script" сразу после фазы сборки "Копирование встроенных фреймворков".
- Вы можете назвать его "Codesign Embedded Frameworks".
- Вставить
./codesign-frameworks.sh
(или все, что вы назвали своим script выше) в текстовое поле редактора script. Используйте./Scripts/codesign-frameworks.sh
, если вы храните script в подкаталоге. - Создайте приложение. Все вложенные структуры будут закодированы.
Если вы все равно получите ошибку "Identity: twoiguous (matches:...", прокомментируйте ниже. Этого больше не должно быть.
Обновлено 2012-11-14: добавление поддержки фреймворков со специальными символами в их имени (это не включает одинарные кавычки) в "codesign-frameworks.sh".
Обновлено 2013-01-30: добавление поддержки специальных символов во всех путях (это должно включать одинарные кавычки) в "codesign-frameworks.sh".
Обновлено 2013-10-29: добавление экспериментальной поддержки dylib.
Обновлено 2013-11-28: добавление поддержки прав. Улучшение поддержки экспериментального дилиба.
Обновлено 2014-06-13: Устранение проблем с кодовыми именами с помощью фреймворков, содержащих (вложенные) фреймворки. Это было сделано добавлением опции -depth
в find
, что приводит к тому, что find
выполняет обход глубины. Это стало необходимым из-за проблемы, описанной здесь. Короче: содержащий пакет может быть подписан только в том случае, если его вложенные пакеты уже подписаны.
Обновлено 2014-06-28: добавление поддержки экспериментальных пакетов.
Обновлено 2014-08-22: Улучшение кода и предотвращение отказа для восстановления IFS.
Обновлено 2014-09-26: добавление поддержки для элементов входа.
Обновлено 2014-10-26: проверка котировок. Это исправляет ошибки "строка 31/42: слишком много аргументов", а результирующая ошибка "кодовый объект вообще не подписан" для путей, включая специальные символы.
Обновлено 2014-11-07: Устранение неоднозначной ошибки идентификации (например, "Разработчик Mac: неоднозначный..." ) при использовании автоматического разрешения идентичности в Xcode. Вам больше не нужно явно устанавливать идентификатор и использовать "Mac Developer"!
Обновлено 2015-08-07: Улучшение семантики.
Усовершенствования приветствуются!