Xcode 10: подписывание кода моей App + Framework завершается неудачно из-за ошибки подписания сторонней инфраструктуры зависимостей (PromiseKit). Работает в Xcode 9 - PullRequest
0 голосов
/ 29 октября 2018

У меня есть проект Xcode 10 - iOS12 swift, который ссылается на мой собственный фреймворк (также Xcode 10 + iOS12).

Проект приложения ссылается на мой каркасный проект как ссылку на подпроект.

Ссылки на проект My Framework PromiseKit.framework (универсальный фреймворк - толстая библиотека), выполненный с использованием следующего сценария сборки:

# Merge Script

# 1
# Set bash script to exit immediately if any commands fail.
set -e

# 2
# Setup some constants for use later on.
FRAMEWORK_NAME="PromiseKit"

# 3
# If remnants from a previous build exist, delete them.
if [ -d "${SRCROOT}/build" ]; then
rm -rf "${SRCROOT}/build"
fi

# 4
# Build the framework for device and for simulator (using
# all needed architectures).
xcodebuild -target "${FRAMEWORK_NAME}" -configuration Release -arch arm64 only_active_arch=no defines_module=yes -sdk "iphoneos"
xcodebuild -target "${FRAMEWORK_NAME}" -configuration Release -arch x86_64 only_active_arch=no defines_module=yes -sdk "iphonesimulator"

# 5
# Remove .framework file if exists on Desktop from previous run.
if [ -d "${SRCROOT}/${FRAMEWORK_NAME}.framework" ]; then
rm -rf "${SRCROOT}/${FRAMEWORK_NAME}.framework"
fi

# 6
# Copy the device version of framework to Desktop.
cp -r "${SRCROOT}/build/Release-iphoneos/${FRAMEWORK_NAME}.framework" "${SRCROOT}/${FRAMEWORK_NAME}.framework"

# 7
# Replace the framework executable within the framework with
# a new version created by merging the device and simulator
# frameworks' executables with lipo.
lipo -create -output "${SRCROOT}/${FRAMEWORK_NAME}.framework/${FRAMEWORK_NAME}" "${SRCROOT}/build/Release-iphoneos/${FRAMEWORK_NAME}.framework/${FRAMEWORK_NAME}" "${SRCROOT}/build/Release-iphonesimulator/${FRAMEWORK_NAME}.framework/${FRAMEWORK_NAME}"

# 8
# Copy the Swift module mappings for the simulator into the
# framework.  The device mappings already exist from step 6.
cp -r "${SRCROOT}/build/Release-iphonesimulator/${FRAMEWORK_NAME}.framework/Modules/${FRAMEWORK_NAME}.swiftmodule/" "${SRCROOT}/${FRAMEWORK_NAME}.framework/Modules/${FRAMEWORK_NAME}.swiftmodule"

# 9
# Delete the most recent build.
if [ -d "${SRCROOT}/build" ]; then
rm -rf "${SRCROOT}/build"
fi

Когда я захожу в архив проекта родительского приложения с использованием Xcode 10 (а также 9.4.1) с включенным Bitcode (который содержит ссылку на My Framework и библиотеку PromiseKit Fat), я получаю следующую ошибку на этапе подписания: (Ошибка проверить битовый код в PromiseKit.framework / PromiseKit: ошибка Невозможно извлечь пакет из /var/folders..../(x86_64) - что говорит о том, что это связано со слайсом симулятора) enter image description here

Если я переключаю опцию «Перестроить из битового кода» в Органайзере в положение «ВЫКЛ», то я получаю другую ошибку: (Сбой подписания кода «PromiseKit.framework») enter image description here

Однако, если я использую Xcode 9.4.1 с выключенным Bitcode, то он экспортируется и подписывает нормально.

Почему он пытается заново подписать под-фреймворки и что я могу сделать, чтобы облегчить проблемы? Мне нужно, чтобы архивация работала нормально с Xcode 10, а также с любыми будущими сторонними зависимостями, добавляемыми к моей целевой платформе. (Это первая динамическая зависимость от фреймворка, добавленная к моей цели Framework. До того, как я «запекся» - подключил все третьи стороны для удобства разработки, но PromiseKit трудно внедрить из-за обширных зависимостей от Objective-c).

Журнал архива Xcode:

 {
        code = 330;
        description = "Failed to resolve linkage dependency PromiseKit x86_64 -> @rpath/libswiftFoundation.dylib: Unknown arch x86_64";
        info =             {
        };
        level = WARN;
    },
            {
        code = 330;
        description = "Failed to resolve linkage dependency PromiseKit x86_64 -> @rpath/libswiftObjectiveC.dylib: Unknown arch x86_64";
        info =             {
        };
        level = WARN;
    },
            {
        code = 0;
        description = "Failed to verify bitcode in PromiseKit.framework/PromiseKit:\nerror: Cannot extract bundle from /var/folders/q5/hm9v_6x53lj0gj02yxqtkmd40000gn/T/IDEDistributionOptionThinning.RJD/Payload/MyAppName.app/Frameworks/PromiseKit.framework/PromiseKit (x86_64)\n\n";
        info =             {
        };
        level = ERROR;
        type = "malformed-payload";
    }
);

В некоторых других решениях, которые я пробовал, использовалась ссылка на проект для PromiseKit вместо ссылки на Framework, однако это не сработало - поскольку мне все еще нужна ссылка на структуру из моего основного проекта, потому что я получу «библиотеку не загружена» msgstr "ошибка во время выполнения, если работает без ссылки на FW. Та же проблема возникает при архивировании при использовании ссылки на проект.

Ответы [ 3 ]

0 голосов
/ 12 ноября 2018

Попробуй это! Это сработало для меня и многих других людей:

Goto

Этапы сборки> Добавить> Этап запуска нового сценария

Код должен работать для любой оболочки по умолчанию, но я рекомендую просто использовать / bin / sh

и включите следующий код:

# Type a script or drag a script file from your workspace to insert its path.
# skip if we run in debug
if [ "$CONFIGURATION" == "Debug" ]; then
echo "Skip frameworks cleaning in debug version"
exit 0
fi

APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"

# This script loops through the frameworks embedded in the application and
# removes unused architectures.
find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK
do
FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)
FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"
echo "Executable is $FRAMEWORK_EXECUTABLE_PATH"

EXTRACTED_ARCHS=()

for ARCH in $ARCHS
do
echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME"
lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"
EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")
done

echo "Merging extracted architectures: ${ARCHS}"
lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}"
rm "${EXTRACTED_ARCHS[@]}"

echo "Replacing original executable with thinned version"
rm "$FRAMEWORK_EXECUTABLE_PATH"
mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH"

done

Похоже, некоторые фреймворки поставляются с архитектурой, которая не будет использоваться в приложении. Xcode откажется подписывать их. Приведенный выше скрипт удаляет неиспользуемые архитектуры.

Кредиты: Какой-то парень в GitHub, я не могу больше найти точный источник.

0 голосов
/ 15 ноября 2018

Я смог встроить (скомпилировать как часть моего фреймворка) - сторонний код фреймворка, не ссылаясь на него как на фреймворк. Мне пришлось провести рефакторинг -> переименовать несколько классов, которые конфликтовали в именовании с моим собственным. Я не хотел, чтобы это добавляло сложность межфреймовых ссылок и отсутствующих / дополнительных фрагментов архитектуры. Поскольку я отдаю приоритет простоте над всем остальным, это решение сработало для меня лучше всего.

0 голосов
/ 04 ноября 2018

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

Если вы не можете использовать статическую библиотеку, лучше отправьте отчет об ошибке в Apple.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...