Transfer Source

The transfer source is the device that has the data and wants to transfer it to another device.

In terms of Bluetooth, the transfer source is the one that is scanning and searching for another device (target).

Example integration

import WultraProximityTransfer

struct MyTransferData: Codable {
    let id: String
    let token: String
}

class MySampleSource: WPTSourceDelegate {

    let source: WPTSource

    let config = WPTConfig(
        serviceUUID: UUID(uuidString: "21f8190c-e4bc-11ed-b5ea-0242ac120001")!, 
        characteristicUUID: UUID(uuidString: "21f8190c-e4bc-11ed-b5ea-0242ac120002")!, 
        coder: WPTAESCoder(
            salt: "MyApplicationDemoSalt!".data(using: .utf8)!, // static data
            iv: Data(base64Encoded: "7x9ZEvEVf4IqlBxuYmzKhw==")! // 16 bytes encoded in Base64
        )
    )

    init() {
        source = WPTSource(config: config)
        source.delegate = self
        source.start()
    }
    
    // MARK: WPTSourceDelegate
    
    func scannedDevicesChanged(_ sender: WPTSource, scannedDevices: WPTScannedDevices) {
                
        guard let device = scannedDevices.bestCandidate else {
            // no device to target
            return
        }
        
        print("Best candidate is \(device.name) with id \(device.id)")
        
        do {
            let dataToTransfer = MyTransferData(id: "123", token: "10a82fe8d1c4df")
            let result = try device.encode(value: dataToTransfer)
            // Show the QR code to the user.
            // You can use "result.generateQRCode".
        } catch let e {
            print("Error during encoding: \(e)")
        }
    }
    
    func sourceStatusChanged(_ sender: WPTSource, status: WPTSourceStatus) {
        print("WPTSource status changed: \(status)")
        switch status {
        case .notStarted:
            //The source did not start yet.
        case .preparing:
            // source is preparing
        case .unsupported:
            // Bluetooth is not available on this device
            break
        case .unauthorized:
            // Bluetooth permission not granted
            // Ask the user to solve it (see System Permissions section in the documentation)
        case .bluetoothOff:
            // Bluetooth is turned off.
            // Tell the user to turn it on.
        case .active:
            // Source is active and waiting for a target device to be discovered.
        }
    }
}

Classes used for the source

WPTSource

Entrypoint for the source. Just start the source and wait for the device to be discovered.

Swift interface of the class

public class WPTSource {

    /// Available devices to target.
    public var targetDevices: WPTTargetDevices { get }

    /// Status of the source
    public var status: WPTSourceStatus { get }

    /// Delegate that will be notified when a target device or status of the source changes
    public weak var delegate: WPTSourceDelegate?

    /// Creates an `WPTSource`
    /// - Parameter config: Configuration of the source. Must be the same as the configuration of the Target.
    public init(config: WPTConfig)

    /// Starts the source (in Bluetooth terms - starts scanning for Bluetooth devices)
    public func start()

    /// Stops the source
    public func stop()
}

WPTSourceDelegate

A delegate will be called when the status of the source changes or the device is discovered/changed.

Swift interface of the class

public protocol WPTSourceDelegate {

    /// When possible target device was found or was changed.
    /// - Parameters:
    ///   - sender: Source
    ///   - targetDevices: Devices available for the transfer
    func targetDevicesChanged(_ sender: WPTSource, targetDevices: WPTTargetDevices)

    /// When the status of the source has changed
    /// - Parameters:
    ///   - sender: Source
    ///   - status: Status of the source
    func sourceStatusChanged(_ sender: WPTSource, status: WPTSourceStatus)
}

WPTSourceStatus

Status of the source for you to react upon and display user to appropriate UI (loading, errors, etc).

Swift interface of the class

public enum WPTSourceStatus {
    /// Service is not started.
    case notStarted
    /// Service or bluetooth is starting.
    case preparing
    /// Bluetooth is not supported on this device.
    case unsupported
    /// Bluetooth permission not granted for the app.
    ///
    /// Show an error to the user and navigate him to the app settings.
    /// ```
    /// let url = URL(string: UIApplicationOpenSettingsURLString)!
    /// UIApplication.shared.open(url, options: [:], completionHandler: nil)
    /// ```
    case unauthorized
    /// Bluetooth is turned off in the system.
    case bluetoothOff
    /// Service is active
    case active
}

WPTTargetDevices

Devices that are currently found and suitable to target.

Unless you have some internal logic, it’s best to use bestCandidate as a device to target (and generate the QR for).

Swift interface of the class

public struct WPTTargetDevices {

    /// All found devices.
    public var allDevices: [WPTTargetDevice] { get }

    /// Best candidate to target in case more than one target was found.
    public var bestCandidate: WPTTargetDevice? { get }
}

WPTTargetDevice

A device that represents a transfer target.

public struct WPTTargetDevice {

    /// Name of the device
    public let name: String

    /// ID of the device
    public let id: String

    /// State of the device
    public var state: WPTTargetDevices.WPTTargetDevice.State { get }

    /// When a device is found, encrypted data needs to be transferred via a generated/scanned QR code.
    /// Use this method for a particular device to encode your data.
    /// - Parameter value: Object to encode
    /// - Returns: Encoded data
    public func encode(value: Encodable) throws -> EncodeResult

    /// When a device is found, encrypted data needs to be transferred via a generated/scanned QR code.
    /// Use this method for a particular device to encode your data.
    /// - Parameter data: Data to encode
    /// - Returns: Encoded data
    public func encode(data: Data) throws -> EncodeResult
}
Last updated on Jan 30, 2024 (12:32) Edit on Github Send Feedback
Search

1.0.0

Proximity Transfer for Apple