Связывание только встроенной платформы с другой динамической структурой не удается при сборке и запуске на устройстве

tl;dr

Связывание вашей встроенной платформы с другой платформой и отсутствие связи другой платформы с вашим приложением приводит к required code signature missing при сборке и запуске на устройстве.

описание:

Настройка:

Моя установка довольно проста (Swift 2.3 и Xcode Xcode 8.0; версия сборки 8S162m):

  • Используя Carthage (0.17.2), я создал Other.framework с xcodebuild 8.0 и TOOLCHAINS=com.apple.dt.toolchain.Swift_2_3 carthage build --platform iOS
  • В MyApp встроен My.framework.
  • Приложение и проекты фреймворка находятся в одной рабочей области Xcode.
  • Я связал Other.framework ТОЛЬКО с My.framework (это означает, что MyApp не связан с Other.framework вообще). Дело в том, что MyApp не обязательно использовать API Other.framework.

Проблема:

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

dyld: Library not loaded: @rpath/Other.framework/Other  
  Referenced from: /private/var/containers/Bundle/Application/DCF0331F-FF23-43CF-AE79-B3857D5A6EE3/MyApp.app/Frameworks/My.framework/My  
  Reason: no suitable image found.  Did find:  
  /private/var/containers/Bundle/Application/DCF0331F-FF23-43CF-AE79-B3857D5A6EE3/MyApp.app/Frameworks/My.framework/Frameworks/Other.framework/Other: required code signature missing for '/private/var/containers/Bundle/Application/DCF0331F-FF23-43CF-AE79-B3857D5A6EE3/MyApp.app/Frameworks/My.framework/Frameworks/Other.framework/Other'  

Я проверил подпись Other.framework, и мне все понравилось. Кроме того,

Решение (временное решение)

Свяжите MyApp с Other.framework. Ужасно ... Это кажется сломанным.

Связывание того же двоичного файла Other.framework с MyApp и решение проблемы таким образом указывает на то, что Other.framework создан нормально и может быть переподписанным правильно. Возможно, никакого отношения к Карфагену.

ПРИМЕЧАНИЕ. Существует аналогичная проблема платформа iOS 8+ с вложенной встроенной структурой, однако моя имеет несколько другую причину.


person Yevhen Dubinin    schedule 22.07.2016    source источник
comment
Я получаю ту же ошибку, но использую Xcode 7.3.1 (7D1014) для создания приложения, работающего на устройстве iOS 10.   -  person outerstorm    schedule 23.07.2016


Ответы (3)


С вложенными фреймворками проблема не связана. Это полностью касается проверки кодовой подписи. dyld сообщает, что в Other.framework отсутствует кодовая подпись. Вам необходимо подписать рамку. Это должно быть сделано за вас с помощью Xcode, поэтому мне любопытно, как создается Other.framework.

Вы, вероятно, сможете обойти это самостоятельно, просто подписав его.

codesign --force --deep --preserve-metadata=identifier,entitlements,resource-rules,requirements,flags,team-identifier --sign - /path/to/Other.framework

или просто отказаться от своего приложения:

codesign --force --deep --preserve-metadata=identifier,entitlements,resource-rules,requirements,flags,team-identifier --sign - /path/to/My.app
person Jeremy Huddleston Sequoia    schedule 05.11.2016

Я исправил свою точную проблему, выполнив это руководство
Вам не нужно свяжите свой Other.framework со своим MyApp. Просто добавьте сценарий запуска, чтобы подписать любую встроенную структуру, для которой отсутствует подпись кода.

person steveluoxin    schedule 18.08.2017
comment
это была моя проблема. У меня было несколько фреймворков, некоторые из них встроены в другие. - person Ivan; 02.11.2020

Обсуждая эту проблему на странице Github Carthage, стало ясно, что обходной путь, упомянутый в вопросе, на самом деле является ожидаемое поведение:

Carthage не поддерживает вложенные фреймворки.

Вложенные фреймворки не позволяют повторно использовать эти фреймворки. Например, если A.framework и B.framework оба зависят от Other.framework, то ни один из них не может вложить Other.framework - в противном случае вы можете получить 2 разные версии, и правильная версия может быть не выбрана во время выполнения.

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

Полное обсуждение: Связывание только встроенной платформы с другой динамической структурой не удается при сборке и запуске на устройстве: "требуется подпись кода отсутствует "

Это было неясно из README, поэтому я поднял еще одну проблему, попросив обновить документацию:

Это решено и закрыто в рамках PR:

# 1427 README upd: связывание зависимостей от встроенных фреймворков с целевым приложением

person Yevhen Dubinin    schedule 19.10.2016