Как вы разрабатываете пакеты фреймворков для Mac App Store?


после недавнего представления я получил следующую ошибку:

недопустимая подпись-вложенный пакет приложений (FooBar.приложение / содержание / фреймворки / GData.framework) не подписана, подпись недействительна или не подписана сертификатом представления Apple. Дополнительную информацию см. В руководстве по подписыванию кода и песочнице приложений.

недопустимая подпись-вложенный пакет приложений (FooBar.приложение / содержание / рамки / рычание.framework) не подписан, подпись недействительной, или он не подписан сертификатом представлении компании Apple. Дополнительную информацию см. В руководстве по подписыванию кода и песочнице приложений.

недействительная подпись - вложенный набор приложений libcurl использует (фрагментик.приложение / содержание / фреймворки / libcurl.framework) не подписана, подпись недействительна или не подписана сертификатом представления Apple. Дополнительную информацию см. В руководстве по подписыванию кода и песочнице приложений.

Так Что Я подписал все пакеты фреймворков на Technote 2206:

codesign -f -v -s "3rd Party Mac Developer Application: Name" ./libcurl.framework/Versions/A/libcurl
codesign -f -v -s "3rd Party Mac Developer Application: Name" ./libcurl.framework/Versions/A/libssh2.1.dylib
codesign -f -v -s "3rd Party Mac Developer Application: Name" ./Growl.framework/Versions/A/Growl
codesign -f -v -s "3rd Party Mac Developer Application: Name" ./GData.framework/Versions/A/GData

Technote 2206 говорит:

Основы Заключения

видя, что фреймворки являются пакетами, было бы логично заключить, что вы можете подписать фреймворк напрямую. Однако, это не тот случай. Чтобы избежать проблем при подписании фреймворков, убедитесь, что вы подписываете определенную версию, а не всю фреймворк:

# Это неправильный путь:

бортовой номер -с моей подписи-идентичность ../ FooBarBaz.рамки

# это правильный путь:

бортовой номер -с моей подписи-идентичность ../ FooBarBaz.framework / Versions / a

и когда я пытаюсь проверить результаты, это выглядит хорошо для меня:

% codesign -vvv FooBar.app/Contents/Frameworks/libcurl.framework
FooBar.app/Contents/Frameworks/libcurl.framework: valid on disk
FooBar.app/Contents/Frameworks/libcurl.framework: satisfies its Designated Requirement
% codesign -vvv FooBar.app/Contents/Frameworks/Growl.framework
FooBar.app/Contents/Frameworks/Growl.framework: valid on disk
FooBar.app/Contents/Frameworks/Growl.framework: satisfies its Designated Requirement

для удовольствия я попытался подписать пакет фреймворков напрямую, и он все равно был отклонен. Но это именно то, что в документации сказано не делать.

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

мое единственное предположение было бы что-то делать с существующими plists (мне нужно владеть идентификаторами в информации фреймворка.plists?) или права -- любые предложения?

4 80

4 ответа:

основываясь на ответе baptr, я разработал этот сценарий оболочки, который кодирует все мои фреймворки и другие двоичные ресурсы / вспомогательные исполняемые файлы (в настоящее время поддерживаемые типы: dylib, bundle и login items):

#!/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\)/\/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
  1. сохраните файл в вашем проекте. Я держу свою копию в Scripts подкаталог в корне моего проекта.
    • помоему называется codesign-frameworks.sh.
  2. добавить "запустить скрипт" на этапе построения сразу после "копирования встроенный Рамки " этап сборки.
    • вы можете назвать его "Codesign Embedded Framework".
  3. вставить ./codesign-frameworks.sh (или то, что вы назвали своим скриптом выше) в текстовое поле редактора скриптов. Используйте ./Scripts/codesign-frameworks.sh если вы храните скрипт в подкаталоге.
  4. создать приложение. Все связанные фреймворки будут разработаны кодами.

если вы все еще получаете "личность: неоднозначно (соответствует: ... " ошибка, пожалуйста, прокомментируйте ниже. Этот не должно происходить.

Обновлено 2012-11-14: добавление поддержки фреймворков со специальными символами в их названии (это не включает одинарные кавычки) в "codesign-frameworks.sh".

Обновлено 2013-01-30: добавление поддержки специальных символов во всех путях (это должно включать одинарные кавычки) в "codesign-frameworks.sh".

Обновлено 2013-10-29: добавление экспериментальной поддержки dylib.

Обновлено 2013-11-28: добавление поддержки прав. Улучшение экспериментальной поддержки dylib.

Обновлено 2014-06-13: исправление проблем проектирования кода с фреймворками, содержащими (вложенные) фреймворки. Это было сделано путем добавления до 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: улучшение семантики.

улучшения добро пожаловать!

ваш комментарий показывает, что вы подписали объекты в каталоге версий пакета. Технот показывает, чтобы подписать сам каталог.

следующие соответствия Technote лучше:

codesign -f -v -s "3rd Party Mac Developer Application: Name" ./libcurl.framework/Versions/A
codesign -f -v -s "3rd Party Mac Developer Application: Name" ./Growl.framework/Versions/A
codesign -f -v -s "3rd Party Mac Developer Application: Name" ./GData.framework/Versions/A

вот как я это исправил;

  • войти в настройки сборки вашей цели
  • Fing строка "другие флаги подписи кода"
  • введите --deep значение параметра release
  • Закрыть XCode
  • войдите в папку производных данных на вашем Mac и удалите старые производные данные (путь по умолчанию: / Users / YOUR_USER_NAME / Library / Developer/Xcode/DerivedData)
  • открыть Xcode и строй

после сборки архива и отправить приложение снова...

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

Я дал более развернутый ответ здесь:как кодировать рычание.рамки для песочницы Mac App