Настройка экспорта Swift-пакета
Вы можете настроить вывод Kotlin/Native для целевой платформы Apple так, чтобы его можно было использовать в качестве зависимости Swift Package Manager (SwiftPM).
Рассмотрим проект Kotlin Multiplatform с целевой платформой iOS. Возможно, вы захотите сделать этот бинарный файл iOS доступным в качестве зависимости для разработчиков iOS, работающих над нативными проектами Swift. С помощью инструментов Kotlin Multiplatform вы можете предоставить артефакт, который легко интегрируется в проекты Xcode.
В этом руководстве показано, как это сделать, собрав XCFrameworks с помощью плагина Kotlin Gradle.
Настройка удалённой интеграции
Чтобы сделать ваш фреймворк доступным для использования, необходимо загрузить два файла:
ZIP-архив с XCFramework. Его нужно загрузить в удобное файловое хранилище с прямым доступом (например, создать релиз на GitHub и прикрепить архив, использовать Amazon S3 или Maven). Выберите вариант, который проще всего встроить в ваш рабочий процесс.
Файл
Package.swiftс описанием пакета. Его нужно отправить в отдельный репозиторий Git.
Варианты конфигурации проекта
В этом руководстве XCFramework хранится в виде бинарного файла в выбранном вами файловом хранилище, а файл Package.swift — в отдельном репозитории Git.
Однако вы можете настроить проект иначе. Рассмотрите следующие варианты организации репозиториев Git:
Храните файл
Package.swiftи код, который нужно упаковать в XCFramework, в отдельных репозиториях Git. Это позволяет управлять версиями манифеста Swift отдельно от версий проекта, описываемого этим файлом. Это рекомендуемый подход: он упрощает масштабирование и обычно облегчает сопровождение.Поместите файл
Package.swiftрядом с кодом Kotlin Multiplatform. Это более простой подход, однако имейте в виду, что в этом случае версии Swift-пакета и кода будут совпадать. SwiftPM использует теги Git для управления версиями пакетов, что может привести к конфликтам с тегами проекта.-
Храните файл
Package.swiftв репозитории проекта-потребителя. Это поможет избежать проблем с версиями и сопровождением. Однако такой подход может вызвать проблемы при настройке SwiftPM с несколькими репозиториями в проекте-потребителе и при дальнейшей автоматизации:В проекте с несколькими пакетами только один пакет-потребитель может зависеть от внешнего модуля (чтобы избежать конфликтов зависимостей внутри проекта). Поэтому всю логику, зависящую от вашего модуля Kotlin Multiplatform, следует инкапсулировать в определённом пакете-потребителе.
Если вы публикуете проект Kotlin Multiplatform с помощью автоматизированного процесса CI, этот процесс должен также включать публикацию обновлённого файла
Package.swiftв репозиторий потребителя. Это может привести к конфликтующим обновлениям репозитория потребителя, поэтому такой этап CI может быть сложно сопровождать.
Настройка проекта Multiplatform
В следующем примере общий код проекта Kotlin Multiplatform хранится локально в модуле shared. Если структура вашего проекта отличается, замените "shared" в примерах кода и путей на имя вашего модуля.
Чтобы настроить публикацию XCFramework:
-
Обновите файл конфигурации
shared/build.gradle.kts, добавив вызовXCFrameworkв список целевых платформ iOS:import org.jetbrains.kotlin.gradle.plugin.mpp.apple.XCFramework kotlin { // Other Kotlin Multiplatform targets // ... // Name of the module to be imported in the consumer project val xcframeworkName = "Shared" val xcf = XCFramework(xcframeworkName) listOf( iosArm64(), iosSimulatorArm64(), ).forEach { it.binaries.framework { baseName = xcframeworkName // Specify CFBundleIdentifier to uniquely identify the framework binaryOption("bundleId", "org.example.${xcframeworkName}") xcf.add(this) isStatic = true } } //... } -
Запустите задачу Gradle, чтобы создать фреймворк:
./gradlew :shared:assembleSharedXCFramework
Созданный фреймворк будет находиться в папке
shared/build/XCFrameworks/release/Shared.xcframeworkв каталоге проекта. Если у вас есть несколько модулей с общим кодом, которые вы хотите экспортировать (например, модуль общей логики и модуль общего пользовательского интерфейса), объедините их в один новый модуль и распространяйте вместо них этот модуль-обёртку.
Подготовка XCFramework и манифеста Swift-пакета
-
Сожмите папку
Shared.xcframeworkв ZIP-файл и вычислите контрольную сумму полученного архива, например:swift package compute-checksum Shared.xcframework.zip -
Загрузите ZIP-файл в выбранное вами файловое хранилище. Файл должен быть доступен по прямой ссылке. Например, вот как это можно сделать с помощью релизов на GitHub:
- Загрузка в релиз GitHub
Перейдите на GitHub и войдите в свою учётную запись.
Перейдите в репозиторий, где хотите создать релиз.
В разделе Релизы справа нажмите ссылку Создать новый релиз.
Заполните сведения о релизе, добавьте или создайте новый тег, укажите заголовок релиза и напишите описание.
-
Загрузите ZIP-файл с XCFramework с помощью поля Прикрепите бинарные файлы, перетащив их сюда или выбрав внизу:

Нажмите Опубликовать релиз.
-
В разделе Ресурсы релиза щёлкните правой кнопкой мыши ZIP-файл и выберите Копировать адрес ссылки или аналогичный пункт в браузере:

-
[Рекомендуется] Проверьте, что ссылка работает и файл можно скачать. В терминале выполните следующую команду:
curl <downloadable link to the uploaded XCFramework ZIP file>
-
Если ваш проект использует зависимости SwiftPM, начиная с Kotlin 2.4.20-RC3 задача Gradle
assembleSharedXCFrameworkсоздаёт файлPackage.swiftрядом с XCFramework.Если это не так, вы можете создать файл
Package.swiftвручную по следующему шаблону:// swift-tools-version:5.3 import PackageDescription let package = Package( name: "Shared", platforms: [ .iOS(.v14), ], products: [ .library(name: "Shared", targets: ["Shared"]) ], targets: [ .binaryTarget( name: "Shared", url: "<link to the uploaded XCFramework ZIP file>", checksum:"<checksum calculated for the ZIP file>") ] ) -
Укажите недостающие поля:
В поле
urlукажите ссылку на ZIP-архив с XCFramework.В поле
checksumукажите контрольную сумму, ранее вычисленную для ZIP-файла.
-
[Рекомендуется] Чтобы проверить полученный манифест, выполните следующую команду оболочки в каталоге с файлом
Package.swift:swift package reset && swift package show-dependencies --format json
В выводе будут описаны обнаруженные ошибки или показан результат успешной загрузки и разбора, если манифест корректен.
Отправьте файл
Package.swiftв удалённый репозиторий. Не забудьте создать и отправить тег Git с семантической версией пакета.
Добавление зависимости от пакета
Теперь, когда оба файла доступны, вы можете добавить зависимость от созданного пакета в существующий клиентский проект iOS или создать новый проект. Чтобы добавить зависимость от пакета:
В Xcode выберите Файл | Добавить зависимости пакета.
-
В поле поиска введите URL репозитория Git, содержащего файл
Package.swift:
-
Нажмите кнопку Добавить пакет, затем выберите продукты и соответствующие целевые платформы для пакета.
Проверка настройки
Чтобы проверить, что всё настроено правильно, проверьте импорт в Xcode:
В проекте перейдите к файлу представления пользовательского интерфейса, например
ContentView.swift.-
Замените код следующим фрагментом:
import SwiftUI import Shared struct ContentView: View { var body: some View { VStack { Image(systemName: "globe") .imageScale(.large) .foregroundStyle(.tint) Text("Hello, world! \(Shared.Platform_iosKt.getPlatform().name)") } .padding() } } #Preview { ContentView() }Здесь вы импортируете XCFramework
Shared, а затем используете его, чтобы получить название платформы из поляText. Убедитесь, что предварительный просмотр обновился и отображает новый текст.
Экспорт нескольких модулей в виде XCFramework
Чтобы сделать код из нескольких модулей Kotlin Multiplatform доступным в виде бинарного файла iOS, объедините эти модули в один модуль-обёртку. Затем соберите и экспортируйте XCFramework этого модуля-обёртки.
Например, у вас есть модуль network и модуль database, которые вы объединяете в модуль together:
-
Укажите зависимости и конфигурацию фреймворка в файле
together/build.gradle.kts:kotlin { val frameworkName = "together" val xcf = XCFramework(frameworkName) listOf( iosArm64(), iosSimulatorArm64() ).forEach { iosTarget -> // Same as in the example above, // with added export calls for dependencies iosTarget.binaries.framework { export(projects.network) export(projects.database) baseName = frameworkName xcf.add(this) } } // Dependencies set as "api" (as opposed to "implementation") to export underlying modules sourceSets { commonMain.dependencies { api(projects.network) api(projects.database) } } } -
Для каждого включённого модуля необходимо настроить целевые платформы iOS, например:
kotlin { android { //... } iosArm64() iosSimulatorArm64() //... } Создайте пустой файл Kotlin в папке
together, напримерtogether/src/commonMain/kotlin/Together.kt. Это обходное решение, поскольку в настоящее время скрипт Gradle не может собрать фреймворк, если экспортируемый модуль не содержит исходного кода.-
Запустите задачу Gradle, которая собирает фреймворк:
./gradlew :together:assembleTogetherReleaseXCFramework
Выполните действия из предыдущего раздела, чтобы подготовить
together.xcframework: создайте архив, вычислите контрольную сумму, загрузите архив XCFramework в файловое хранилище, создайте файлPackage.swiftи отправьте его.
Теперь вы можете импортировать зависимость в проект Xcode. После добавления директивы import together классы из обоих модулей — network и database — будут доступны для импорта в коде Swift.
© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/multiplatform/multiplatform-spm-export.html