Создание толстого фреймворка с целевой зависимостью фреймворка

Я работаю со Swift 4.2 и Xcode 10.1. Я пытаюсь построить в Swift фреймворк, который зависит от Alamofire, который написан на Objective C. Я добавил Alamofire.xcodeproj вручную, как указано в README от Alamofire. Индивидуальная цель строит нормально. Моя цель Framework хорошо работает.

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

xcodebuild -project "${FRAMEWORK_NAME}.xcodeproj" -scheme "${FRAMEWORK_NAME}" -configuration "${CONFIGURATION}" -arch arm64 -arch armv7 -arch armv7s only_active_arch=no BITCODE_GENERATION_MODE=bitcode defines_module=yes -sdk "iphoneos" -derivedDataPath "${OUTPUT_DIR}"

Я получаю следующую ошибку:

заголовок зонтика 'Alamofire.h' не найден

не удалось собрать модуль Objective-C 'Alamofire'

Вторая строка ошибки исходит от другой зависимости 'Moya', которая зависит от Alamofire (см. Изображение).

Просто удивительно, что обычный Cmd+B работает нормально для обычной цели, но xcodebuild не работает.

Вещи, которые я пытался:

  1. Удаление производной папки, Чистая сборка.
  2. Сначала создайте индивидуальные зависимости, а затем создайте универсальную агрегированную цель.
  3. Создание пользовательской карты модуля
  4. Изменение конфигурации всех зависимостей на одну и ту же, например, Debug
  5. Изменение языковой версии Swift Alamofire.xcodeproj на Swift 4.2

Я думаю, что команда xcodebuild требует большего ввода. Что мне не хватает?

Обновления:

Копаю дальше. Папка Заголовки внутри Debug-iphoneos/Alamofire.framework/ пусто, которое, как ожидается, будет содержать зонтичный заголовок Alamofire.h.

2 ответа

Решение

Оказывается, вложенная зависимость была проблемой.

MyFramework зависел от Moya, а Moya зависел от Alamofire. После того, как я добавил Alamofire.xcodeproj как подмодуль в Moya.xcodeproj, xcodebuild волшебным образом нашел все зонтичные заголовки правильно.

Вы пробовали что-нибудь из этого:

1.Добавить -ObjC в Настройки сборки -> Связывание -> Другие флаги компоновщика.

2. Импортирование всех фреймворков, от которых зависит фреймворк Objective C, в ваш проект, т. Е. На этапах сборки -> Link Binary With Libraries.

3.Добавить #import для них в файл заголовка префикса, который необходимо добавить в проект в настройках сборки в поле "Заголовок префикса".

Обновление: Разработка пункта 3:

Чтобы использовать Objective C Framework в вашем проекте Swift, вам нужно создать файл заголовка Swift Bridging в этом проекте. Лучший способ - создать файл.h вручную.

Сначала добавьте в проект файл заголовка с именем: MyProjectName-Bridging-Header.h. Это будет единственный заголовочный файл, в который вы импортируете любой код Objective C, для которого вам нужен код Swift.

Найдите Swift Compiler - раздел "Генерация кода" в настройках сборки вашего проекта. Добавьте путь к файлу заголовка моста рядом с Objective C Bridging Header из корневой папки проекта. Это должен быть MyProject/MyProject-Bridging-Header.h

Ему просто нужен один Bridging Header. Введите операторы #import в этот файл, и ваши классы будут доступны в вашем коде проекта Swift без каких-либо дополнительных операторов #import.

Вы также можете взглянуть на этот урок: Интеграция цели c в swift

Другие вопросы по тегам