Приложение iOS с разбитой инфраструктурой на устройстве, dyld: библиотека не загружена, Xcode 6 Beta

Этот сбой был проблемой блокировки. Я использовал следующие шаги, чтобы воспроизвести проблему:

  • Создать проект Cocoa Touch Framework
  • Добавьте файл swift и класс Dog
  • Построить рамки для устройства
  • Создайте приложение Single View в Swift
  • Импортировать фреймворк в проект приложения
  • Создание экземпляра класса swift из фреймворка во ViewController
  • Создайте и запустите приложение на устройстве

При запуске приложения произошел сбой, вот консольный журнал:

dyld: Library not loaded: @rpath/FrameworkTest03.framework/FrameworkTest03
  Referenced from: /var/mobile/Applications/FA6BAAC8-1AAD-49B4-8326-F30F66458CB6/FrameworkTest03App.app/FrameworkTest03App
  Reason: image not found

Я пытался собрать на устройствах iOS 7.1 и 8.0, у них обоих один и тот же сбой. Тем не менее, я могу собрать приложение и нормально работать на симуляторе. Кроме того, я знаю, что могу изменить структуру для формирования Обязательный на Необязательный в Link Binary With Libraries, но это не полностью решило проблему, приложение упало при создании экземпляра Dog. Поведение отличается на устройстве и симуляторе, я подозреваю, что мы не можем распространять платформу для устройства, используя бета-версию XCode. Кто-нибудь может пролить свет на это?

Ответ 1

На целевой вкладке Общие имеется поле Встроенные двоичные файлы. Когда вы добавляете фреймворк, устраняется сбой.

Ссылка здесь на форумах разработчиков Apple.

Ответ 2

Для iOS больше или равно 8

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

enter image description here

Почему это происходит?:, потому что структура, с которой вы связываетесь, скомпилирована как динамически связанная структура и, таким образом, связана с ней во время выполнения.

Примечание. Встраивание настраиваемых фреймворков поддерживается только в iOS > 8, и, следовательно, последует альтернативное решение, которое работает в более ранних версиях iOS.

Для iOS менее 8

Если вы влияете на эту структуру (имеете доступ к процессу исходного кода/сборки), вы можете изменить эту структуру, чтобы она была статически связана, а не динамически связана. Это приведет к тому, что код будет включен в ваше скомпилированное приложение, а не связан с ним во время выполнения, и, следовательно, структура не должна быть внедрена.

Как: На вкладке "Настройка сборки" в разделе "Связывание" измените тип Mach-O на статическую библиотеку. Теперь вам не нужно включать фреймворк в встроенные двоичные файлы.

Static Framework

Включая активы: Чтобы включить такие вещи, как изображения, аудио или файлы xib/nib, я рекомендую создать пакет (в основном каталог, дополнительную информацию здесь bit.ly/ios_bundle), а затем загрузить активы из пакета с использованием NSBundle.

Ответ 3

Просто перетаскивание фреймворка в ваш проект не будет достаточно хорошим. Это все равно, что быть на одной площадке, но не найти своих детей. Следуй этим шагам:

1) Создайте свой фреймворк

  • Развейте свою структуру.
  • Как только ваша разработка будет завершена, COMMAND + B создаст ваш фреймворк и получит "Build Succeeded".

enter image description here

2) Доступ к вашей структуре

  • Как только ваш каркасный проект будет успешно собран, он будет готов для доступа к папке " Products " в вашем проекте.

enter image description here

  • Щелкните правой кнопкой мыши на .framework и выберите "Показать в Finder".

enter image description here

3) Поместите фреймворк в свой проект

  • Перетащите .framework из окна Finder в папку "Framework" проекта приложения.

enter image description here

4) Настройте проект приложения для фреймворка

  • Выберите верхний уровень в вашем проекте

enter image description here

  • Выберите цель

enter image description here

  • Перейдите в "Фазы сборки", затем "Связать двоичные файлы с библиотеками" и убедитесь, что ваша инфраструктура включена с опционально выбранным.

enter image description here

  • Все еще в "Этапы сборки", перейдите в верхний левый угол и нажмите кнопку +. В раскрывающемся списке выберите "Фаза создания новых файлов копирования".

enter image description here

  • Прокрутите вниз до нового раздела "Копировать файлы" и убедитесь, что для пункта " Destination " установлено значение "Рамки". Оставьте подпуть пустым. Затем нажмите кнопку + в левом нижнем углу.

enter image description here

  • Вам будет представлена иерархия вашего проекта. Прокрутите вниз до папки "Frameworks", в которую вы добавили структуру на шаге 3, или найдите ее в строке поиска вверху. Выберите ваш фреймворк и нажмите "Добавить".

enter image description here

  • Убедитесь, что ваш фреймворк включен с выбранным "Code Sign On Copy".

enter image description here

5) Очистите, а затем запустите свой проект

  • COMMAND + SHIFT + K
  • COMMAND + R

Ответ 4

Сначала попробуйте построить после Command + Option + Shift + K. Если все еще не удается, выполните ниже шаги.

Если кто-то сталкивается с этой ошибкой в ​​Xcode 8, измените статус фрейма на Необязательный, а не Обязательно на вкладке Общие для вашей цели.

введите описание изображения здесь

Ответ 5

Я создал фреймворк с использованием Swift3/Xcode 8.1 и использовал его в проекте Objective-C/Xcode 8.1. Чтобы исправить эту проблему, мне пришлось включить опцию Always Embed Swift Standard Libraries в Build Options.

Посмотрите на этот скриншот:

enter image description here

Ответ 6

У меня такая же проблема в версии iOS 9.x

ISSUE IS: App crashes as soon as I open the app with below error.

dyld: Library not loaded: /System/Library/Frameworks/UserNotifications.framework/UserNotifications Referenced from: /var/containers/Bundle/Application/######/TestApp.app/TestApp Reason: image not found

Я решил эту проблему, изменив Required на Optional в Linked Frameworks and Libraries для рамки UserNotifications.framework.

Ответ 7

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

См. Как добавить "Фаза сборки файлов копий" в мою цель для получения дополнительной информации.

Официальные документы Apple: https://developer.apple.com/library/mac/recipes/xcode_help-project_editor/Articles/CreatingaCopyFilesBuildPhase.html

Ответ 8

Мне пришлось (в дополнение к тому, что упоминалось здесь) добавить следующую строку в Пути поиска пути > на вкладке "Настройки сборки":
@executable_path/Frameworks

enter image description here

Ответ 9

Добавьте структуру в встроенные двоичные файлы enter image description here

Затем очистите и постройте.

Ответ 10

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

Ответ 11

Если вы используете стороннюю структуру и используете Cocoapod в качестве менеджера зависимостей, попробуйте сделать pod install, чтобы обновить свои контейнеры.

Эта авария произошла в сторонней библиотеке, которую я использовал, поэтому рад, что вышеупомянутое решение сработало для меня, надеюсь, что это сработает для вас!

Ответ 12

Удивительно, но не все необходимые фрагменты описаны здесь, по крайней мере, для Xcode 8.

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

https://forums.developer.apple.com/thread/4687

Я должен был установить Dynamic Library Install Name Base (DYLIB_INSTALL_NAME_BASE) в разделе " Build Settings Framework, а затем перестроить ее. Он был неправильно установлен в $(LOCAL_LIBRARY_DIR) и мне пришлось изменить его на @rpath.

Таким образом, на этапе обработки ссылок он инструктировал приложение-хост динамически загружать его во время выполнения из /Library/Frameworks/fw.Framework/fw (как в корне файловой системы), а не в путь к App /Frameworks/fw.Framework/fw

Что касается всех других настроек: он должен быть в 3-х местах в Build Phases, но все они устанавливаются сразу, когда вы просто добавляете его в настройку Embedded Binaries на вкладке General в приложении для хостинга.

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

PBXCp /Users/xyz/Library/Developer/Xcode/DerivedData/MyApp-cbcnqafhywqkjufwsvbzckecmjjs/Build/Products/Debug-iphoneos/MyFramework.framework

[Многие verbose строки удалены, но это видно из упрощенной расшифровки в интерфейсе Xcode.]

Я до сих пор не знаю, почему Xcode неправильно установил значение DYLIB_INSTALL_NAME_BASE.

Ответ 13

Моя среда: Cocos2d 2.0, Box2d, Objective C

В дополнение к выполнению других ответов выше я, наконец, перешел на вкладку "Общие" и сделал WatchKit необязательным.

Целевые общие связанные структуры и библиотеки Watchkit.framework Дополнительно

Ответ 14

enter image description here

Решено для меня, сняв флажок "Копировать только при установке" в Build Phases-> Вставить рамки

Ответ 15

У меня была такая же проблема. Я попытался создать свой проект с iPhone, который я никогда раньше не использовал, и я не добавлял новую структуру. Для меня очистка работала нормально (Shift + Command + K). Может быть, потому, что я использую бета-версию 5 Xcode 7 и iPhone 6 с бета-версией iOS 9, но это сработало.

Ответ 16

В моем случае мой проект написан target-c, а в библиотеке есть файлы Swift. Поэтому я изменил "Всегда встраивать стандартные библиотеки Swift" на вкладке " Настройки сборки " своих проектов на " Да", и все стало совершенно нормально.

Ответ 17

Если у вас есть программа разработки, удалите свое приложение из установки симулятора из pod → clean → run again...

Ответ 18

То же самое произошло, когда я создал новую схему конфигурации и сборки.

Поэтому решение для меня состояло в том, чтобы запустить

pod install

для этой вновь созданной конфигурации.

Ответ 19

Попробуйте все методы, доступные в Интернете, и мои собственные пробные и ошибочные трюки 100 раз. Наконец, я смог ее решить. - Апекша Саху 6 мин назад
Перейти к iTunes в Mac → accounts--> Авторизовать этот компьютер - Apeksha Sahu 5 минут назад
второй шаг... Goto разработчик в настройках iPad и iPhone и переиндексация с идентификаторами и очистить все компьютеры доверия. Это сработало для меня............... После переустановки Mac OSHigh seria 10.13.15 из последней версии Mac OS seirra, чтобы переустановить последнюю версию Xcode после обновления всех сертификатов. и т.д. и т.д. и т.д.... так много методов, как вы думаете. - enter image description here

Ответ 20

Попробуйте изменить флаг ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES (в более ранних версиях xcode: Embedded Content Contains Swift Code) в настройках сборки с NO на YES.

Ответ 21

Если вы используете Xcode 11 или более новую версию:

  1. Перейдите к настройкам своей цели и выберите Общие.

Target Settings/General

  1. Прокрутите вниз до Каркасы, библиотеки и встроенный контент.

  2. Убедитесь, что Embed & Значение или Вставить без подписи выбирается для параметра Вставить, если это необходимо.

Frameworks, Libraries and Embedded Content section

Ответ 22

  1. Перейти к файлу в xcode → Параметры рабочей области
  2. Нажмите стрелку рядом с которой появится/Пользователи /apple/Library/Developer/Xcode/DerivedData
  3. Выберите данные Derived и переместите их в корзину.
  4. Достаточно xcode и снова его открыть.
  5. Очистите проект и снова запустите.

Выше были решены мои исходы.

Ответ 23

Это ошибка времени выполнения, вызванная Dynamic Linker

dyld: Library not loaded: @rpath/...
...
Reason: image not found

Ошибка Library not loaded с @rpath[About] указывает на то, что Dynamic Linker не может найти структуру.

  1. Проверьте, был ли фреймворк добавлен в General -> Embedded Binaries

  2. Проверьте, содержит ли @rpath - Build Settings -> Runpath Search Paths путь с тем же местом назначения/подпуть, который был настроен в Build Phases -> Embed Frameworks -> Destination, Subpath

Подробнее здесь

Ответ 24

В случае, если кто-либо все еще испытывает эту проблему, несмотря на все шаги, описанные в многих других ответах, вам может потребоваться отменить и воссоздать сертификат подписи кода, как показано ниже:

https://developer.apple.com/library/ios/qa/qa1886/_index.html

Ответ 25

Для тех, у кого исправление не работает, попробуйте обновить ОС до Yosemite. Это сработало для меня!