У меня есть кодовая база, состоящая из верхнего слоя Swift, который должен быть опубликован c API и Objective- C "потроха", и мне нужно красиво обернуть его в iOS .framework
чтобы другие разработчики могли внедрить мое решение без кражи интеллектуальной собственности.
Как я знаю, мне нужно использовать систему модулей, чтобы заставить Obj-C
и Swift
работать вместе.
Итак что я сделал:
1) Я создал module.modulemap
2) Я создал module.private.modulemap
3) Я установил DEFINES_MODULE
на YES
4) Я установил Import Paths
Swift в папку Framework, где расположены оба модуля.
Вот как выглядит мой module.modulemap
:
framework module CoolSDK {
umbrella header "/full/path/to/file/MyUmbrella.h"
export *
module * { export * }
}
Вот как мой module.private.modulemap
выглядит так:
module CoolSDK_Private [extern_c] {
header "/full/path/to/file/ObjC-Guts.h"
export *
}
У меня несколько вопросов:
1) Почему мне нужно указать полный путь к файлам в модулях? Когда я пытаюсь установить только имя, например, header "file.h"
я получаю сообщение об ошибке, что файл не может быть найден. Я уверен, что файлы, которые я пытаюсь включить l ie в модули. Есть ли какой-то параметр, который я могу установить в Build settings
?
2) Как я уже говорил выше, я планирую построить фреймворк с Obj-C
кишками и верхним слоем Swift, и поэтому я не очень мне нужен зонтичный заголовок, мне просто нужно определить частный модуль, чтобы Swift-часть могла иметь доступ к Obj-C
части (вроде как мы делаем это с Bridging-Header
, но когда дело доходит до фреймворков, это не вариант). Что мне делать в этой ситуации? Если я полностью удаляю module.modulemap
, XCode генерирует свой собственный module.modulemap
, который выглядит следующим образом:
module CoolSDK.Swift {
header "CoolSDK-Swift.h"
requires objc
}
И, конечно, у меня появляется ошибка CoolSDK-Swift.h can not be found
, поэтому я считаю, что это не вариант. Должен ли я включить мой Swift
publi c файл API в качестве зонтичного заголовка?
3) Хотя мой фреймворк построен успешно, и внутри Modules
папки фреймворка нет module.private.modulemap
, это именно то, что я нужно (чтобы скрыть любые признаки кишок Obj- C через приватный модуль), я все еще могу получить доступ к приватному модулю в моих тестах SDK, например, import CoolSDK.Private
. Как я могу сделать этот модуль исключительным по объему фреймворка и не позволить пользователю получить доступ к моему приватному модулю?