Создание толстого фреймворка с целевой зависимостью фреймворка
Я работаю со 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 не работает.
Вещи, которые я пытался:
- Удаление производной папки, Чистая сборка.
- Сначала создайте индивидуальные зависимости, а затем создайте универсальную агрегированную цель.
- Создание пользовательской карты модуля
- Изменение конфигурации всех зависимостей на одну и ту же, например, Debug
- Изменение языковой версии 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