Подтвердить что ты не робот

Не удается отладить модуль/фрейм Swift, встроенный в приложение Objective-C

Альтернативные заголовки (для поиска)

  • Невозможно отладить структуру Swift 2.3, связанную с приложением Objective-C в Xcode 8
  • error in auto-import: failed to get module 'XYZ' from AST context Xcode 8
  • Xcode 8 не может отлаживать инфраструктуру Swift
  • warning: Swift error in module <XYZ>
  • Временное решение; Xcode Debugger не может отлаживать приложения, написанные только в Objective-C, но эту ссылку против фреймворков, написанных только в Swift. (28312362)

У меня есть приложение, написанное в Objective-C, которое ссылается на некоторые модули (фреймворки), написанные в Swift 2.x.

Вопрос

Все (отладка и т.д.) отлично работает в , однако при переходе на и обновление модулей для использования я не удалось отладить модули.

LLDB сообщил об этих ошибках:

warning: Swift error in module XYZ.
Debug info from this module will be unavailable in the debugger.

error: in auto-import:
failed to get module 'ABC' from AST context

Это не происходит, если я привяжу модули к приложению, созданному в Swift 2.3.

4b9b3361

Ответ 1

ТЛ: дг

Добавьте настройку, определенную пользователем, в разделе "Настройки сборки" для целевой цели вашего приложения.

SWIFT_VERSION = 2.3

SWIFT_VERSION = 2.3 - Настройки сборки

Подробнее

Я не уверен, что это ошибка Xcode 8 или политика Apple (чтобы попытаться заставить разработчиков Swift 3.0?). Но... по умолчанию Xcode 8 устанавливает версии Swift 3.0 стандартных библиотек времени исполнения Swift.

Когда дело доходит до отладки с LLDM, модули Swift 2.3 не загружаются (в среду исполнения Swift 3.0).

Принудительное приложение для использования Swift 2.3 (или устаревшего Swift, как его называют Apple), устраняет проблему.

У приложений Swift этот параметр отображается в Xcode, но вы должны вручную добавить его для приложения Objective-C.

Дополнительные советы

Поместите свой Swift 2.3 код в Swift 3.0 как можно скорее, Apple не будет поддерживать 2.x очень долго.

Ответ 2

Для меня это было так же просто, как это было больно и отнимало много времени:

import SDWebImage был ПРОБЛЕМОЙ, потому что в одной из платформ уже был упакован SDWebImage (и я его не видел), и этой платформой оказался Objective-C, а приложение - Swift. Я также добавил SDWebImage в проект, потому что я использую его в классах, которые я пишу, и то, что создало беспорядок, с которым не может справиться отладчик Xcode. В общем, убедитесь, что у вас НИЧЕГО не продублировано, я бы проверил, например, такие общие вещи, как SDWebImage.

Ответ 4

Я обсуждал эту проблему с инженером Apple по имени Шон на WWDC 2017.

Моя команда провела недели, пытаясь понять это, и это оказалось ошибкой в ​​Apple-компиляторе, который мы никогда бы не разобрали сами. Кроме того, он имеет ОЧЕНЬ легкое обходное решение.

Там случается ошибка с тем, как компиляционные флаги агрегируются из фреймворков и проекта, а проект "чистый Objective-C" активирует его.

Решение: добавьте один единственный пустой файл Swift ( "Whatever.swift" или что-то еще) в ваш проект Objective-C, сделав его not-pure- objective-c больше (new- > file- > Swift file, don 't создать заголовок моста. Файл будет содержать только импорт Foundation).

И что это. Проблема решена.

Ответ 5

В моем случае мне пришлось удалить Objective-C Bridging header из файла настроек сборки. Мой заголовочный файл Bridging ничего не сделал.. так что все в порядке.

Ответ 6

Я столкнулся с сообщением error in auto-import: failed to get module 'XYZ' from AST context при попытке отладки в симуляторе 9.3. Переключение на симулятор 10.2 разрешило проблему.

Ответ 7

Я столкнулся с этим при создании каркаса с Карфагеном. Попытка отладки выдаст ошибку, которая ссылается на зависимость от инфраструктуры Obj-C.

Я нашел эту запись в блоге, в которой предлагалось добавить в проект следующие пользовательские настройки сборки:

Для отладки: REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES = NO

Для выпуска: REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES = YES

Это исправило проблему для меня.

Ответ 8

Попробуйте перезапустить Xcode. В моем случае он разрешил проблему.

Ответ 9

В моем случае была ошибка компилятора в коде "C", о котором сообщалось в LLDB, после исправления ошибки LLDB снова начал работать.

Ответ 10

Как предположил Тим fooobar.com/questions/295940/... основной причиной нашей проблемы был вопрос дубликатов.

У нас была категория обертки obj-c для SDWebImage, которая использовалась как для obj-c, так и для Swift. При импорте категории из Swift все взорвалось из-за переопределения/дублирования импорта, так как модуль SDWebImage уже выставил себя как модуль Swift.

Решение? Мы повторно реализовали категорию obj-c как расширение Swift и продолжали использовать ее как из Swift, так и из obj-c, добавив @objc перед расширением и импортировав файл #import "product-Swift.h" из obj- с.

И, возможно, начать с проверки: https://developer.apple.com/library/content/qa/qa1947/_index.html.

Ответ 11

Мне просто потребовалось 2 дня, чтобы все время разрешать и отлаживать с помощью команды печати. Теперь я получил вопрос:

Мой проект находится в Swift, и я использовал библиотеку Objective-C, аналогичную импортированной в pods для swift (старый проект Objective-C, объединенный в этом), и использовал импорт IQKeyboardManager, а также заголовок import IQKeyboardManager.h. Это конфликты и удаление заголовка, наконец, решили мою проблему. Вы можете проверить с этим типом двуличия в библиотеках.