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

494

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

  • Создайте проект Cocoa Touch Framework
  • Добавьте быстрый файл и класс Dog
  • Структура сборки для устройства
  • Создайте приложение Single View в 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, они оба имеют одинаковый сбой. Однако я могу создать приложение и отлично работать на симуляторе. Также я знаю, что я могу изменить структуру с Required to Optional в Link Binary With Libraries, но это не полностью устранило проблему, приложение разбилось, когда я создаю экземпляр Dog. Поведение отличается от устройства и симулятора, я подозреваю, что мы не можем распространять фреймворк для устройства, используя бета-версию Xcode. Может ли кто-нибудь пролить свет на это?

  • 1
    Что я не понимаю, так это то, почему все другие сторонние фреймворки работают «из коробки» и могут быть легко перетащены в Link Binary with Libraries и каким-то образом Xcode знает, как скопировать их в ваш пакет приложений, тогда как для пользовательских фреймворков это просто не это случилось.
  • 0
    ответ sazzad hissain khan здесь stackoverflow.com/questions/26024100/… это лучший ответ ..
Показать ещё 2 комментария
Теги:
crash
xcode6

21 ответ

843
Лучший ответ

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

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

  • 58
    У меня есть структура в Embedded Binaries, и у меня также есть Фаза копирования, установленная на «Frameworks». В любом случае он падает.
  • 9
    Это решается только в режиме отладки. Ошибка снова возникнет, когда вы архивируете или строите проект
Показать ещё 23 комментария
224

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

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

Изображение 1595

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

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

Для iOS менее 8

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

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

Изображение 1596

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

  • 0
    Как добавить фреймворк во встроенные бинарные файлы, если фреймворк находится в Pods?
  • 0
    Что вы подразумеваете под "фреймворк в стручках"? Что ваш пользовательский фреймворк распространяется через CocoaPods?
Показать ещё 2 комментария
69

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

1) Создайте свою структуру

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

Изображение 1597

2) Доступ к инфраструктуре

  • После того, как проект вашей инфраструктуры будет успешно создан, он будет готов к вам в вашей папке " Products " в вашем проекте.

Изображение 1598

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

Изображение 1599

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

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

Изображение 1600

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

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

Изображение 1601

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

Изображение 1602

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

Изображение 1603

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

Изображение 1604

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

Изображение 1605

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

Изображение 1606

  • Убедитесь, что ваша фреймворк включен в "Кодовая подпись".

Изображение 1607

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

  • COMMAND + SHIFT + K
  • COMMAND + R
  • 3
    Хорошая точка зрения. Это почти работает для меня. Я сделал каркас A, в который входит Alamofire. Мой хост App (встроенный фреймворк A) работает в симуляторах. Но когда я пытаюсь запустить его на реальном iPhone, он вылетает с ошибкой: Alamofire: dyld: Библиотека не загружена: @ rpath / Alamofire.framework / Alamofire Причина: подходящее изображение не найдено. Действительно нашел: xxx / ddcdemo.app / Frameworks / iddc.framework / Frameworks / Alamofire.framework / Alamofire: мач-о, но неправильная архитектура
  • 2
    Это сработало для меня, спасибо
Показать ещё 5 комментариев
43

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

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

Изображение 1609

Надеюсь, что это поможет!

  • 2
    Теперь это работает для меня в at. Решение этой проблемы состоит в том, чтобы перейти к BuildPhases -> Copy Files -> select Framework под Destination и добавить свой framework. Скорее всего, ваша библиотека здесь отсутствует.
  • 0
    @Harish, решение, которое вы предлагаете, уже предложено несколькими, и я определенно позабочусь об этом в первую очередь. В моем случае фреймворк был добавлен туда, но все же появилась та же проблема. Тогда я копаю сам. Если вы проголосовали за это решение, я не знаю, почему вы достаточно уверены в своем способе, когда в моем случае это не сработало: S
Показать ещё 3 комментария
41

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

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

Изображение 1608

  • 3
    Это заставит среду выполнения не распознавать классы из фреймворка
  • 0
    @azimov правильно. Я сталкиваюсь с этой дилеммой в данный момент. Обязательный вызывает ошибку «изображение не найдено», и если мы попытаемся установить его как необязательный, то произойдет сбой во время выполнения с «нераспознанным селектором»
Показать ещё 9 комментариев
25

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

Изображение 1610

  • 0
    Это исправило проблему для меня. У меня возникла проблема после добавления расширения приложения в мое приложение iOS 9. Перед добавлением расширения мой фреймворк был найден просто отлично. Добавление фазы сборки Copy Files не помогло, и я уже встраивал фреймворк.
  • 0
    Это так странно, что это не включено по умолчанию. Если вы разархивируете и посмотрите на свой IPA, вы должны найти свои фреймворки в Payloads / appname.app / Frameworks /. Тем не менее, добавление этого пути поиска должно быть доступно для приложения, чтобы искать в этой папке во время выполнения. Weird.
23

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

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

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

  • 0
    Попробовав так много вещей, я решил это. У меня уже были рамки в Link Binary и Embed Framework. Я не думал, что должен был также добавить Фазу Копирования, но это исправило это.
20

У меня такая же проблема в версии 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.

  • 0
    Это работает. Кто-нибудь знает почему? Потому что некоторые устройства нуждаются в этой настройке, другие нет.
  • 2
    Потому что каркас UserNotifications требует iOS10
Показать ещё 3 комментария
12

Добавьте структуру в встроенные двоичные файлы Изображение 1611

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

8

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

7

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

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

Изображение 1612

6

Удивительно, но не все необходимые фрагменты описаны здесь, по крайней мере, для 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.

  • 1
    Я рад, что продолжал пролистывать ответы. Это исправило мою проблему. Спасибо :)
6

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

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

  • 1
    Большой! исправил мою проблему. Но есть ли способ избежать установки зависимостей pod в моем хост-приложении?
5

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

  • 0
    И, возможно, Чистая папка сборки тоже (CMD + Shift + Alt + K)
2

Изображение 1614

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

  • 0
    Было бы неплохо узнать смысл этого флажка, если система не считает, что «отладочная установка» не является «установкой». В любом случае, если это вызывает сбой приложения на оборудовании, а не запрещает запуск приложения с предупреждением, это еще один явный дефект XCode
2

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

2

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

1

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

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

pod install

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

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

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

-2

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

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

  • 0
    какое отношение подпись кода имеет к этой ошибке?
  • 0
    Именно так. Подписание кода не имеет ничего общего с этой ошибкой.
Показать ещё 2 комментария
-26

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню