Быстрое создание скомпилированного SDK для iOS с зависимостью от сторонних разработчиков (с использованием CocoaPods)
У меня есть 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 и приложение).
Есть ли у вас какие-нибудь предложения? Как бы Вы это сделали?
Спасибо!
1 ответ
Когда ты сказал For example, Alamofire, '~> 4.2.0'. But I don't like this approach because this way the app can't use a newer version of Alamofire (or the other dependencies), only because the compiled sdk has been compiled with that version.
Я не думаю, что вы поняли концепцию скомпилированного SDK... Когда вы упаковываете SDK, он будет статическим, поэтому не имеет значения возможность появления новых сторонних зависимостей, для обновления SDK вам необходимо выпустить новый версия для клиента, так что вы можете загрузить при необходимости... Клиент не может обновить SDK самостоятельно, нет вообще.
(должен быть комментарий, но слишком большой для него)