Skip to content
Быстрые старты

Быстрый старт для 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 (набор инструментов, поставляющий swift 6+)
  • Набор инструментов Rust (rustup.rs) — библиотека FFI собирается из исходников на Rust
  • Локальная копия репозитория ForestVPN

1. Получите исходники

git clone [email protected]:forestvpn/forestvpn.git
cd forestvpn

2. Соберите 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 добавьте зависимость по пути:

Package.swift (yours)
dependencies: [
  .package(path: "../forestvpn/forestvpn-apple"),
],
targets: [
  .target(
    name: "MyApp",
    dependencies: [
      .product(name: "ForestVPNKit", package: "forestvpn-apple"),
    ]
  ),
]

ForestVPNKit — продукт для приложения; пакет также экспортирует ForestVPNFFI (низкоуровневые привязки UniFFI) и другие продукты для Network Extension, биллинга и генерируемых клиентов API.

4. Первый вызов: откройте сессию и прочитайте статус

FirstStatus.swift
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 раннерах этот шаг явно пропускается).