У меня есть SDK в Swift 5.1, который наш клиент хотел бы распространять (продавать) как скомпилированный SDK, а не предоставлять свои источники.
К сожалению, этот SDK зависит от некоторых сторонних библиотек, интегрированных с использованием CocoaPods (Alamofire, RealmSwift, ReachabilitySwift и т. Д.). Я знаю, что вам следует избегать сторонних зависимостей в ваших фреймворках / библиотеках, но, к сожалению, мы начали работать над этим проектом после того, как другое агентство начало его. Этот SDK на самом деле является модулем cocoapod, но это не скомпилированный модуль.
Как лучше всего распространять этот SDK как скомпилированный SDK (чтобы не передавать исходные файлы конечным потребителям, которые его купят)?
Насколько я понял, если вы компилируете свой sdk с зависимостью от сторонних производителей, вы должны быть уверены, что приложение будет использовать те же библиотеки с тем же общедоступным API, что и скомпилированный sdk, иначе приложение выйдет из строя при время выполнения. Насколько я понимаю, единственный способ сделать это - указать очень строгую версию каждой сторонней зависимости в скомпилированной спецификации подкачки sdk. Например, Alamofire, '~> 4.2.0'. Но мне не нравится этот подход, потому что таким образом приложение не может использовать более новую версию Alamofire (или другие зависимости) только потому, что скомпилированный sdk был скомпилирован с этой версией.
Я создаю XCFramework, а затем podspec с этим XCFramework, поставляемым как vendored_framework (используя CocoaPods 1.9.0-beta2, который в настоящее время является единственным, который в настоящее время поддерживает XCFrameworks как vendored_framework).
Я пробовал много разных подходов, например, пытался создать скомпилированный sdk как статические библиотеки и связать его сторонние зависимости как статические библиотеки, но в этом случае при использовании его в приложении вместе с теми же зависимостями (например, Alamofire) я вижу в консоли некоторые «Класс X реализован как в Y, так и в Z. Какой из них использовать, не определен» (где Y и Z - это SDK и приложение).
Есть ли у вас какие-нибудь предложения? Как бы Вы это сделали ?
Спасибо!