# iOS

O SPIDX Button é uma biblioteca iOS concebida para ser integrada em uma Aplicação iOS. Ela fornece uma View de Botão para ser usada na aplicação e classes que se comunicam com o servidor SPIDX para recuperar um Link Dinâmico e um ID para a transação definida por um Caso de Uso.

## Requisitos

* Versão mínima do iOS

  > iOS 13.0
* Ambiente de desenvolvimento

  > Xcode IDE v11+

## Importação e configuração

1. Arraste o `SpidxButton.framework` pasta para dentro da pasta Frameworks.

   > Se a pasta Frameworks não existir, arraste o arquivo para a pasta do projeto.
2. Abra as configurações do projeto clicando no item superior na árvore de arquivos.
3. Vá para a `__Geral__` (ou `__General__`) aba do seu `__target__`.
4. Clique e arraste o `.framework` na árvore de arquivos do projeto para a “`__Frameworks, Libraries and etc__`” seção.
5. Altere a configuração dos frameworks de **Do not embed** para **Embed & Sign**.

## Collection Types

* Collection: Coleta biométrica padrão.
* Verification: Coleta biométrica para verificar se corresponde a uma conta existente (SpidxAccount)
* Registration: Coleta biométrica padrão que reutiliza dados de uma coleta anterior já realizada.

## Classes e Métodos

### Classe SpidxButton

* **collection():**

  > Método que usa as variáveis `apiKey` e `useCaseName` para recuperar o link dinâmico para um link do tipo collection. O mesmo método pode ser usado para resgatar links do tipo registration.
* **verification():**

  > Método que usa as variáveis `apiKey`, `useCaseName`, e `spidxAccount` para recuperar o link dinâmico de verificação.
* **setAuth(apiKey: String, useCaseName: String, spidxAccount: String? = nil):**

  > Método necessário para popular as variáveis que serão usadas pelas funções listadas acima. Tanto apiKey quanto useCaseName são parâmetros obrigatórios. SpidxAccount é opcional e, se não for definido na chamada do método, terá valor nulo.

### Respostas

Os métodos **collection ()** e **verification ()** têm um callback que retorna um objeto do tipo `UseCaseData`. Este objeto possui as variáveis: `dynamicLink`, `transactionID`, `errorDescription`, e `rawError`. Se ocorrer um erro, as variáveis de erro serão populadas e as outras serão nulas. Em caso de sucesso, as variáveis relacionadas ao link e à transação são populadas e as outras são nulas.

## Uso

Você pode adicionar visualmente o botão a `.storyboard` ou `.xib` arquivos da seguinte forma:

* Adicione um UIButton comum e mude sua classe para **SpidxButton**, assim como seu módulo.
* Altere o tipo do botão para custom, se não estiver.
* Crie uma outlet de referência e ação para o botão:

```swift
import SpidxButton
import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var spidxButton: SpidxButton!

    override func viewDidLoad() {
        super.viewDidLoad()
        self.spidxButton.setAuth(apiKey: <String>, useCaseName: <String>, spidxAccount: <String>)
    }

    @IBAction func spidxButtonTapped(_  sender: Any) {

        self.spidxButton.verification() { data in
            //Acesse UseCaseData
            print("dynamicLink", data?.dynamicLink)
            print("transactionID", data?.transactionID)
            print("error", data?.rawError)
            print("errorDesc", data?.errorDescription)
        }
    }
}
```

Você também pode adicionar o botão a uma view programaticamente da seguinte forma:

```swift
import SpidxButton
import UIKit

class ViewController: UIViewController {

    var spidxButton: SpidxButton!

    override func viewDidLoad() {
        super.viewDidLoad()
        self.spidxButton = SpidxButton(frame: CGRect(x: <CGFloat>, y: <CGFloat>, width: <CGFloat>, height: <CGFloat>))
        self.view.addSubview(spidxButton)

        self.spidxButton.setAuth(apiKey: <String>, useCaseName: <String>, spidxAccount: <String>)

        spidxButton.addTarget(self, action: #selector(spidxButtonTapped(_:)), for: .touchUpInside)
    }

    @objc func spidxButtonTapped(_ sender: SpidxButton) {
        self.spidxButton.verification() { data in
            //Acesse UseCaseData
            print("dynamicLink", data?.dynamicLink)
            print("transactionID", data?.transactionID)
            print("error", data?.rawError)
            print("errorDesc", data?.errorDescription)
        }
    }

}
```

Observe que as proporções do botão serão sempre respeitadas em qualquer um dos casos mencionados acima, ou seja, a altura do botão será sempre 1/4 da largura. Mesmo que outro valor seja passado no construtor do botão, ele será sobrescrito.

Após gerar o link, é recomendado que ele seja aberto usando o serviço DynamicLink do Firebase, disponível através de cocoa pods (<https://firebase.google.com/docs/dynamic-links/ios/receive>), ou usando algo como:

```swift
self.spidxButton.verification() { data in

	//Abrir DynamicLink no Navegador
	guard data?.dynamicLink != nil, let url = URL(string: (data?.dynamicLink)!) else {return}

	DispatchQueue.main.sync {
		UIApplication.shared.open(url)
	}
}
```

o que abrirá o próprio app SPIDX (se o usuário o tiver instalado) ou o link em questão em um navegador, que então redirecionará o usuário para o SPIDX.


---

# 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://docs.griaule.com/sdks/spidxbutton/spidxbuttonios.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.
