---
title: "sdk/ios"
description: "SDK Swift para iOS e macOS usando ASWebAuthenticationSession, fluxode código de autorização PKCE S256 e armazenamento de tokens noKeychain."
locale: "pt-BR"
---

> Documentation Index
> Fetch the relevant documentation index at: https://vonvon.id/pt-br/sdks/llms.txt
> Use this file to discover all available pages before exploring further.

# sdk/ios

## Estado

O status do package é **Implementado e verificado localmente**. A suíte de testes unitários Swift passa no macOS para o package iOS. O comportamento em simulador ou dispositivo e um ciclo completo com um IdP real em uma instância Vonvon em execução ainda aguardam verificação manual. Esta página documenta o comportamento implementado; não é uma declaração de prontidão para produção.

Status do registry: UNPUBLISHED. Instale este SDK somente a partir do checkout do código-fonte do repositório; não use um registry de pacotes externo.

## Requisitos

- iOS 16+ / macOS 13+
- Swift 5.9+ e Xcode 15+
- Sem dependências de terceiros — usa apenas frameworks do sistema Apple

## Instalação

Adicione o pacote via Swift Package Manager no Xcode (Arquivo -&gt;Adicionar Dependências de Pacote) ou diretamente em`Package.swift`:

```swift
// Package.swift
dependencies: [
.package(path: "../vonvon/sdk/ios"),
],
targets: [
.target(name: "YourApp", dependencies: [.product(name: "Vonvon", package: "ios")]),
]
```

## Início rápido

```swift
import Vonvon

// 1. Configure in @main App.init. offline_access is rejected until DPoP is implemented.
Vonvon.shared.configure(options: VonvonConfiguration(
issuer: URL(string: "https://vonvon.id")!,
clientId: "your_client_id",
redirectUri: URL(string: "com.example.app://auth/callback")!,
scopes: ["openid", "profile", "email"]
))

// 2. Sign in (opens ASWebAuthenticationSession)
try await Vonvon.shared.signIn()

// 3. Handle redirect in SceneDelegate
let session = try await Vonvon.shared.handleRedirect(url: callbackUrl)

// 4. Read the current unexpired session. Expiry requires reauthorization.
if let session = try await Vonvon.shared.getSession() {
let token = try await Vonvon.shared.getAccessToken()
}

// 5. Clear local state and optionally call end_session.
try await Vonvon.shared.signOut(callEndSession: true)
```

## API principal

| Método | Descrição |
| --- | --- |
| `configure(options:)` | Inicializa com issuer, clientId, redirectUri, scopes. Chame antes detodos os outros. |
| `signIn(options:) async throws` | Abre ASWebAuthenticationSession com URL de autorização PKCE S256.Retorna quando a sessão do navegador termina. |
| `handleRedirect(url:) async throws -> VonvonSession` | Valida o state OAuth, troca o código de autorização no endpoint detoken, persiste os tokens no Keychain e retorna uma sessão. |
| `getSession() async throws -> VonvonSession?` | Retornar a sessão iOS atual não expirada; o estado do token expirado é limpo e o método retorna nil. |
| `getAccessToken(forceRefresh:) async throws -> String` | Retornar o token de acesso atual não expirado. O SDK rejeita offline\_access até que DPoP seja implementado; a expiração exige nova autorização. |
| `signOut(callEndSession:) async throws` | Limpa os tokens do Keychain. Passe true para chamar o endpointend\_session via navegador. |
| `setTokenStorage(_:) throws` | Substitua o KeychainTokenStorage padrão por uma implementaçãopersonalizada de TokenStorageAdapter. |

## Adaptador de armazenamento

O armazenamento padrão usa o Keychain com`kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly` — os tokensnão são sincronizados com o iCloud Keychain. Implemente o protocolo`TokenStorageAdapter` para usar uma política de Keychainempresarial:

```swift
struct EnterpriseKeychain: TokenStorageAdapter {
func save(key: String, value: String) throws { /* ... */ }
func load(key: String) throws -> String? { /* ... */ }
func delete(key: String) throws { /* ... */ }
}
try Vonvon.shared.setTokenStorage(EnterpriseKeychain())
```

## Segurança

- Cliente público — nenhum segredo de cliente armazenado ou transmitido.
- Apenas PKCE S256. O servidor rejeita o método de desafio plain.
- State OAuth aleatório gerado por requisição; validado noredirecionamento para prevenir CSRF.
- O code\_verifier PKCE é gravado no Keychain apenas durante o fluxo deautorização e excluído imediatamente após a troca de código.
- ASWebAuthenticationSession iniciada comprefersEphemeralWebBrowserSession = true para evitar ocompartilhamento de cookies do navegador entre aplicativos.

## Limitações conhecidas

- A verificação de token de ID ES256/RS256 com suporte de JWKS, a validação de nonce e o logout por end\_session estão implementados e testados localmente. Um ciclo completo com um IdP real em um dispositivo ou simulador iOS ainda é necessário antes do suporte L4.
- O comportamento do Keychain deve ser verificado em teste Xcode de dispositivo ou simulador.

Source: https://vonvon.id/pt-br/sdks/ios/index.mdx
