Быстрый старт для Apple
Подключите Swift-пакет ForestVPN из исходников и прочитайте первый статус туннеля на iOS, macOS или tvOS.
Apple SDK — это исходный SwiftPM-пакет в каталоге forestvpn-apple/
репозитория ForestVPN. Его Swift-API (ForestVPNKit) оборачивает
Rust-среду выполнения управляющей плоскости через слой UniFFI
(ForestVPNFFI), поэтому одна сборка нативной библиотеки обслуживает и ваше
приложение, и его Network Extension.
Честно о распространении: готового xcframework для скачивания нет, как
нет и пакета в реестре — вы подключаете пакет из локальной копии исходников
и один раз собираете Rust-FFI самостоятельно. Минимальные версии платформ:
iOS 18.0, macOS 14.0, tvOS 17.0.
Что понадобится
- macOS с Xcode (набор инструментов, поставляющий
swift6+) - Набор инструментов Rust (rustup.rs) — библиотека FFI собирается из исходников на Rust
- Локальная копия репозитория ForestVPN
1. Получите исходники
git clone [email protected]:forestvpn/forestvpn.git
cd forestvpn2. Соберите Rust-FFI один раз
Swift-пакет линкуется с нативной библиотекой, собранной из Rust-воркспейса. Из корня репозитория:
make apple-ffi-xcframeworkВ результате появится forestvpn-apple/Frameworks/ForestvpnApple.xcframework
— единственный нативный артефакт, с которым линкуются и цель вашего
приложения, и appex-расширение Network Extension. Сам Swift-пакет линкует
библиотеку по имени (libforestvpn_apple_ffi), поэтому убедитесь, что
xcframework (или, для запуска swift build/swift test из командной строки,
флаг -Xlinker -L<path>, указывающий на собранную библиотеку) есть в пути
линковки вашей цели.
3. Подключите пакет
В Xcode: File → Add Package Dependencies… → Add Local…, выберите каталог
forestvpn-apple/, затем добавьте xcframework из шага 2 в раздел
Frameworks, Libraries, and Embedded Content вашей цели. Либо в собственном
Package.swift добавьте зависимость по пути:
dependencies: [
.package(path: "../forestvpn/forestvpn-apple"),
],
targets: [
.target(
name: "MyApp",
dependencies: [
.product(name: "ForestVPNKit", package: "forestvpn-apple"),
]
),
]ForestVPNKit — продукт для приложения; пакет также экспортирует
ForestVPNFFI (низкоуровневые привязки UniFFI) и другие продукты для Network
Extension, биллинга и генерируемых клиентов API.
4. Первый вызов: откройте сессию и прочитайте статус
import Foundation
import ForestVPNKit
/// Open a control-plane session and read the current status.
///
/// The bootstrap profile JSON comes from your project's consumer plane
/// (`GET /consumer/v1/bootstrap`) after the device authenticates.
func firstStatus(bootstrapProfileJSON: String, stateDirectory: URL) throws -> Data {
print("SDK ABI \(ForestVPNControlPlaneClient.abiVersion), "
+ "runtime \(ForestVPNControlPlaneClient.runtimeVersion)")
let client = try ForestVPNControlPlaneClient.open(
stateDirectory: stateDirectory,
bootstrapProfileJSON: bootstrapProfileJSON
)
defer { client.close() }
return try client.statusJSON()
}JSON bootstrap-профиля — это конфигурация для конкретного устройства,
которую ваш бэкенд получает из GET /consumer/v1/bootstrap после
аутентификации устройства; о жизненном цикле устройства см.
Устройства.
5. Запуск
Соберите цель приложения как обычно (swift build в пакете, зависящем от
ForestVPNKit, или ⌘R в Xcode). При первом запуске сниппет выводит версии ABI
и среды выполнения SDK, а затем текущий документ статуса в формате JSON.
Чем проверяется
scripts/quickstart-verify/apple-swiftpm.sh — разрешает манифест пакета,
проверяет наличие документированных продуктов и разбирает сниппет с этой
страницы при каждом прогоне CI (полная сборка swift build требует
Rust-сборки из шага 2, поэтому в CI на не-macOS раннерах этот шаг явно
пропускается).