Developer SDK

Swift examples

Install the SDK · View source on GitHub ↗

integration/Sources/URExampleIntegration/UrSession.swift

import Foundation
import URnetworkSdk

public struct ClientSetupError: Error, CustomStringConvertible {
  public let description: String
  public init(_ value: String) { description = value }
}
public final class UrSession {
  public let device: SdkDeviceLocal
  private let manager: SdkNetworkSpaceManager
  private var closed = false
  public init(connect: Bool = true) throws {
    let env = ProcessInfo.processInfo.environment
    guard let jwt = env["URNETWORK_CLIENT_JWT"], !jwt.isEmpty,
      let instance = env["URNETWORK_INSTANCE_ID"], !instance.isEmpty
    else {
      throw ClientSetupError("Set URNETWORK_CLIENT_JWT and a persistent URNETWORK_INSTANCE_ID")
    }
    var error: NSError?
    guard let id = SdkParseId(instance, &error) else {
      throw error ?? ClientSetupError("Invalid instance UUID") as NSError
    }
    guard let manager = SdkNewNetworkSpaceManagerNoStorage() else {
      throw ClientSetupError("No network space manager")
    }
    self.manager = manager
    let values = SdkNetworkSpaceValues()
    values.migrationHostName = "bringyour.com"
    guard
      let space = manager.updateNetworkSpaceValues(
        SdkNewNetworkSpaceKey("ur.network", "main"), values: values)
    else {
      manager.close()
      throw ClientSetupError("No network space")
    }
    space.getApi()?.setByJwt(jwt)
    guard
      let device = SdkNewDeviceLocalWithDefaults(
        space, jwt, "Swift example", "swift", "1", id, false, &error)
    else {
      manager.close()
      throw error ?? ClientSetupError("Device setup failed") as NSError
    }
    self.device = device
    if connect {
      let location = SdkConnectLocation()
      let id = SdkConnectLocationId()
      id.bestAvailable = true
      location.connectLocationId = id
      device.setConnectLocation(location)
    }
  }
  public func close() {
    if !closed {
      closed = true
      device.close()
      manager.close()
    }
  }
  deinit { close() }
}