Skip to main content

Uso Básico

Após instalar e configurar o SDK, você pode iniciar a verificação de liveness com poucas linhas de código.

Exemplo Completo com SwiftUI

import SwiftUI
import HubLivenessSDK
import AVFoundation

struct LivenessView: View {
    @State private var isLoading = false
    @State private var resultMessage: String?
    @State private var showPermissionAlert = false

    var body: some View {
        VStack(spacing: 24) {
            Button(action: checkPermissionAndStart) {
                HStack {
                    if isLoading {
                        ProgressView()
                            .tint(.white)
                    }
                    Text(isLoading ? "Verificando..." : "Iniciar Liveness")
                }
                .frame(maxWidth: .infinity)
                .padding()
                .background(Color.blue)
                .foregroundColor(.white)
                .cornerRadius(12)
            }
            .disabled(isLoading)

            if let message = resultMessage {
                Text(message)
                    .padding()
            }
        }
        .padding()
        .alert("Permissão Necessária", isPresented: $showPermissionAlert) {
            Button("OK") {}
        } message: {
            Text("Habilite a câmera nas configurações do app.")
        }
    }

    private func checkPermissionAndStart() {
        switch AVCaptureDevice.authorizationStatus(for: .video) {
        case .authorized:
            startLivenessVerification()
        case .notDetermined:
            AVCaptureDevice.requestAccess(for: .video) { granted in
                DispatchQueue.main.async {
                    if granted {
                        startLivenessVerification(riskLevel: .low)
                    } else {
                        showPermissionAlert = true
                    }
                }
            }
        default:
            showPermissionAlert = true
        }
    }

    private func startLivenessVerification(riskLevel: HubRiskLevel) {
        isLoading = true
        resultMessage = nil

        Task {
            do {
                try await HubLiveness.shared.startLiveness(
                    riskLevel: riskLevel
                ) { result in
                    Task { @MainActor in
                        isLoading = false

                        switch result {
                        case .success(let data):
                            resultMessage = "Verificação concluída! Score: \(data.livenessScore ?? 0)"

                        case .failure(let error):
                            resultMessage = "Erro: \(error.localizedDescription)"

                        case .cancelled:
                            resultMessage = "Verificação cancelada"
                        }
                    }
                }
            } catch {
                await MainActor.run {
                    isLoading = false
                    resultMessage = "Erro: \(error.localizedDescription)"
                }
            }
        }
    }
}

Níveis de Risco

O SDK oferece três níveis de segurança para a detecção de liveness:
/// Risk level for liveness detection
public enum HubRiskLevel : String, Sendable, CaseIterable, Codable {

    case low

    case medium

    case high
}

HubResult

O resultado da verificação é retornado através do enum HubResult:
public enum HubResult: Sendable {
    case success(HubSuccessData)
    case failure(HubError)
    case cancelled
}

HubSuccessData

Em caso de sucesso, você recebe os seguintes dados:
public struct HubSuccessData: Sendable {
    public let faceImage: Data        // Imagem facial capturada
    public let livenessScore: Double? // Score de liveness
    public let sessionId: String?     // ID da sessão no backend
    public let metadata: [String: String] // Metadados adicionais
}

HubError

Em caso de falha, você recebe um erro tipado:
public enum HubError: Error, Sendable {
    case notInitialized
    case invalidConfiguration
    case cameraPermissionDenied
    case userCancelled
    case timeout
    case livenessCheckFailed(reason: String)
    case networkError(String)
    case unknownError(String)
}

Resumo das Classes Principais

ClasseTipoDescrição
HubLivenessclassSingleton - ponto de entrada do SDK
HubConfigstructConfiguração do SDK
HubRiskLevelenumNíveis de risco para detecção
HubResultenumResultado da verificação
HubSuccessDatastructDados de sucesso
HubErrorenumErros tipados
HubLocalizationstructConfiguração de idioma

Referência Rápida

// Inicialização
try await HubLiveness.shared.initialize(config: HubConfig)

// Verificação de Liveness
try await HubLiveness.shared.startLiveness(
    riskLevel: HubRiskLevel,
    onCompletion: (HubResult) -> Void
)

Próximos Passos