# iOS

O campo **link** é usado para direcionar o usuário. Esse campo é recebido na resposta de sucesso da criação da transação.

Aqui você encontrará a melhor forma de gerenciar a experiência do usuário em sua aplicação iOS:

Para o cenário de uso em iOS, o uso da **ASWebAuthenticationSession** é uma das maneiras recomendadas.

Após criar a transação e obter o link da transação, a seguinte implementação é recomendada:

* Em seu fluxo comum (que está inserido o IDPay), você irá abrir a **ASWebAuthenticationSession** com o link gerado via API;
* Você poderá customizar essa abertura da maneira que for o ideal para seu aplicativo;
* Irá monitorar se houve alteração de URL (para a **redirectUrl**) e então feche a página;

Para fazer o fluxo funcionar é necessário seguir os seguintes passos:

## Passo 1: Criar o controlador de autenticação de pagamento <a href="#passo-1-criar-o-controlador-de-autenticacao-de-pagamento" id="passo-1-criar-o-controlador-de-autenticacao-de-pagamento"></a>

O primeiro passo que você deve realizar é criar o controlador de autenticação de pagamentos, para isso crie uma classe chamada `IDPayAuthenticationController` (ou como preferir chamar).

Na sequência, importe o framework `AuthenticationServices` no topo da classe.

Declare a classe como `NSObject` e implemente o protocolo `ASWebAuthenticationPresentationContextProviding`.

O resultado deve ser:

{% code overflow="wrap" %}

```swift
import AuthenticationServices

class IDPayAuthenticationController: NSObject, ASWebAuthenticationPresentationContextProviding {
    func presentationAnchor(for session: ASWebAuthenticationSession) -> ASPresentationAnchor {
           if let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene {
               if let mainWindow = windowScene.windows.first {
                   return mainWindow
               }
           }
           return ASPresentationAnchor()
       }
}
```

{% endcode %}

## Passo 2: Implementar a autenticação[​](https://developers.unico.io/docs/idPay/sdk-guides/languages/iOS/aswebauthenticationsession#passo-2-implementar-a-autentica%C3%A7%C3%A3o) <a href="#passo-2-implementar-a-autenticacao" id="passo-2-implementar-a-autenticacao"></a>

Abra o arquivo onde você irá realizar a autenticação e adicione as importações necessárias (em nosso exemplo estamos fazendo no `ContentView.swift`).

```swift
import SwiftUI
import AuthenticationServices
```

Para controlar o estado da autenticação criaremos uma propriedade `@State`.

```swift
@State private var isAuthenticated = false
```

Crie uma instância da classe `IDPayAuthenticationController` fora do corpo da estrutura `ContentView`.

```swift
let idPayController = IDPayAuthenticationController()
```

Para realizar a validação do pagamento crie uma função chamada authenticatePayment.

{% code overflow="wrap" %}

```swift
func authenticatePayment() {
    guard let url = URL(string: "URL_AUTHENTICATION") else { return }

    var session: ASWebAuthenticationSession?
    session = ASWebAuthenticationSession(url: url, callbackURLScheme: "BUNDLE") { callbackURL, error in
        guard callbackURL != nil else {
            if let error = error {
                return print("Erro durante a autenticação: \(error.localizedDescription)")
            }
            return
        }

        // Processa o URL de callback para verificar se a autenticação foi bem-sucedida
        session?.cancel()
        isAuthenticated = true
    }

    session?.presentationContextProvider = idPayController
    session?.prefersEphemeralWebBrowserSession = true
    session?.start()
}
```

{% endcode %}

{% hint style="danger" %}
Lembre-se de alterar a url `URL_AUTHENTICATION` para a URL de autenticação recebida em sua transação e também o **callbackURLScheme** `BUNDLE` para o **redirect** informado na criação de sua transação (recomendamos o uso do **Bundle Identifier** de seu aplicativo).
{% endhint %}

{% hint style="info" %}
É importante setar `prefersEphemeralWebBrowserSession` para `true` para garantir uma autenticação única por transação.
{% endhint %}

Exemplo de como deverá ficar no app:[​](https://developers.unico.io/docs/idPay/sdk-guides/languages/iOS/aswebauthenticationsession#exemplo-de-como-dever%C3%A1-ficar-no-app)

<figure><img src="https://3928390238-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fmbfp7FKwpg3cwSHRBJ6w%2Fuploads%2FNWYH0C1R4Oh5FyP0rik7%2Fw.gif?alt=media&#x26;token=52cf4838-3441-4e83-8293-7d3379c61018" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
É necessário algumas permissões para funcionar corretamente, tais como:

* Câmera;
* Geolocalização.
  {% endhint %}

Para saber mais sobre, recomendamos uma leitura nos seguintes artigos e documentações:

* Para acessar a documentação oficial, clique [<mark style="color:blue;">aqui</mark>](https://developer.apple.com/documentation/webkit/wkwebview).


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://devcenter.unico.io/unico-idpay/integracao/controlando-a-experiencia/mobile/ios.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
