iOS Umbrella Framework - проблема с кодом - PullRequest
1 голос
/ 19 марта 2019

У меня есть Umbrella Framework, распространяемая через Cocoapods в качестве встроенной платформы и скомпилированная в режиме выпуска.

Он отлично работает с симулятором, но у меня проблема с кодом на подфреймворке, вложенном в слой зонтика.

Это ошибка:

dyld: Library not loaded: @rpath/Subframework.framework/Subframework
Referenced from: /private/var/containers/Bundle/Application/02AD328F-9E78-4D53-9C39-0C8639B00D81/sdkInteTest.app/Frameworks/Umbrella.framework/Umbrella
Reason: no suitable image found. Did find:
/private/var/containers/Bundle/Application/02AD328F-9E78-4D53-9C39-0C8639B00D81/sdkInteTest.app/Frameworks/Umbrella.framework/Frameworks/Subframework.framework/Subframework: code signature in (/private/var/containers/Bundle/Application/02AD328F-9E78-4D53-9C39-0C8639B00D81/sdkInteTest.app/Frameworks/Umnrella.framework/Frameworks/Subframework.framework/Subframework) not valid for use in process using Library Validation: mapped file has no cdhash, completely unsigned? Code has to be at least ad-hoc signed.

Затем, если я запускаю приложение, чтобы подписать подкаркас со следующим сценарием:

pushd ${TARGET_BUILD_DIR}/${PRODUCT_NAME}.app/Frameworks/Umbrella.framework/Frameworks
for EACH in *.framework; do
echo "-- signing ${EACH}"
/usr/bin/codesign --force --deep --sign "${EXPANDED_CODE_SIGN_IDENTITY}" --entitlements "${TARGET_TEMP_DIR}/${PRODUCT_NAME}.app.xcent" --timestamp=none $EACH
done
popd

Я получаю эту ошибку:

/Users/xxx/Library/Developer/Xcode/DerivedData/sdkInteTest-bbfpzsxuhjomfmaumywyncnbwbla/Build/Intermediates.noindex/sdkInteTest.build/Debug-iphoneos/sdkInteTest.build/Script-F9547ACC224017BF0030EA0B.sh: line 3: pushd: /Users/xxx/Library/Developer/Xcode/DerivedData/sdkInteTest-bbfpzsxuhjomfmaumywyncnbwbla/Build/Products/Debug-iphoneos/sdkInteTest.app/Frameworks/Umbrella.framework/Frameworks: No such file or directory
-- signing *.framework
*.framework: No such file or directory
/Users/xxx/Library/Developer/Xcode/DerivedData/sdkInteTest-bbfpzsxuhjomfmaumywyncnbwbla/Build/Intermediates.noindex/sdkInteTest.build/Debug-iphoneos/sdkInteTest.build/Script-F9547ACC224017BF0030EA0B.sh: line 8: popd: directory stack empty

1 Ответ

1 голос
/ 01 апреля 2019

Решение

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

Я написал полное руководство по созданию платформы iOS Umbrella!

Решение, которое я нашел, следующее:

1) Шаг первый:

В подфайле интеграционного проекта (не зонтичного проекта) добавьте следующую строку кода, где вы добавляете зависимости:

script_phase :name => 'Sign', :script => './sign.sh'

как это:

target 'yourTarget' do

    # Pods for sdkInteTest
    #your pods goes here

    script_phase :name => 'Sign', :script => './sign.sh'
end

2) Шаг второй:

Чем в терминале в корне вашего тестового интеграционного проекта:

В терминале введите:

touch sign.sh
chmod 777 sign.sh
open sign.sh

И в файле скрипта добавьте этот код:

echo "Signing subframeworks"
pushd "${TARGET_BUILD_DIR}"/"${PRODUCT_NAME}".app/Frameworks/YOURFRAMEWORKNAME.framework/Frameworks
for EACH in *.framework; do
echo "-- signing ${EACH}"
/usr/bin/codesign --force --deep --sign "${EXPANDED_CODE_SIGN_IDENTITY}" --entitlements "${TARGET_TEMP_DIR}/${PRODUCT_NAME}.app.xcent" --timestamp=none $EACH
done
popd

echo "BUILD DIR ${TARGET_BUILD_DIR}"

не забудьте переименовать имя фреймворка.

Таким образом, вы говорите CocoaPods запустить фазу сценария после установки модуля. К сожалению, это «клиентское» решение, я безуспешно пытался найти решение для применения на уровне инфраструктуры.

...