Основываясь на ответе baptr, я разработал этот сценарий оболочки, который кодирует все мои фреймворки и другие двоичные ресурсы / вспомогательные исполняемые файлы (в настоящее время поддерживаются типы: dylib, bundle и элементы входа в систему):
#!/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
в корне моего проекта.
- Шахта называется
codesign-frameworks.sh
.
- Добавьте фазу сборки «Run Script» сразу после фазы сборки «Copy Embedded Frameworks».
- Вы можете назвать это «Codesign Embedded Frameworks».
- Вставьте
./codesign-frameworks.sh
(или как вы назвали свой скрипт выше) в текстовое поле редактора скриптов. Используйте ./Scripts/codesign-frameworks.sh
, если вы храните скрипт в подкаталоге.
- Создайте свое приложение. Все связанные рамки будут иметь кодовую подпись.
Если вы по-прежнему получаете ошибку « Identity : неоднозначная (соответствует:…», пожалуйста, прокомментируйте ниже. Это больше не должно происходить.
Обновлено 2012-11-14: добавлена поддержка платформ со специальными символами в названии (не включая одинарные кавычки) в «codesign-frameworks.sh».
Обновлено 2013-01-30: добавлена поддержка специальных символов во всех путях (включая одинарные кавычки) в «codesign-frameworks.sh».
Обновлено 2013-10-29: добавлена экспериментальная поддержка dylib.
Обновлено 2013-11-28: добавлена поддержка прав. Улучшение экспериментальной поддержки dylib.
Обновлено 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 Developer: неоднозначная…») при использовании автоматического разрешения идентификации в XCode. Вам больше не нужно явно устанавливать личность и вы можете просто использовать «Mac Developer»!
Обновлено 2015-08-07: Улучшение семантики.
Улучшения приветствуются!