Как скрыть приватный модуль iOS Framework? - PullRequest
0 голосов
/ 29 января 2020

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

...