# iOS

SPIDX Button es una biblioteca para iOS concebida para integrarse en una aplicación iOS. Proporciona una vista de Botón para usar en la aplicación y clases que se comunican con el servidor SPIDX para obtener un Enlace Dinámico y un ID para la transacción definida por un Caso de Uso.

## Requisitos

* Versión mínima de iOS

  > iOS 13.0
* Entorno de desarrollo

  > Xcode IDE v11+

## Importación y configuración

1. Arrastra la `SpidxButton.framework` carpeta dentro de la carpeta Frameworks.

   > Si la carpeta Frameworks no existe, arrastra el archivo a la carpeta del proyecto.
2. Abre la configuración del proyecto haciendo clic en el elemento superior del árbol de archivos.
3. Ve a la `__Geral__` (o `__General__`) pestaña de tu `__target__`.
4. Haga clic y arrastre el `.framework` desde el árbol de archivos del proyecto a la “`__Frameworks, Libraries and etc__`” sección.
5. Cambia la configuración de los frameworks de **Do not embed** a **Embed & Sign**.

## Collection Types

* Collection: Recolección biométrica estándar.
* Verification: Recolección biométrica para comprobar si coincide con una cuenta existente (SpidxAccount)
* Registration: Recolección biométrica estándar que reutiliza datos de una recolección anterior ya realizada.

## Clases y Métodos

### Clase SpidxButton

* **collection():**

  > Método que usa las variables `apiKey` y `useCaseName` para recuperar el enlace dinámico para un enlace de tipo collection. El mismo método puede usarse para canjear enlaces de tipo registration.
* **verification():**

  > Método que usa las variables `apiKey`, `useCaseName`, y `spidxAccount` para recuperar el enlace dinámico de verificación.
* **setAuth(apiKey: String, useCaseName: String, spidxAccount: String? = nil):**

  > Método requerido para rellenar las variables que serán usadas por las funciones listadas arriba. Tanto apiKey como useCaseName son parámetros obligatorios. SpidxAccount es opcional y si no se define en la llamada al método tendrá un valor nulo.

### Respuestas

Los métodos **collection ()** y **verification ()** tienen un callback que devuelve un objeto de tipo `UseCaseData`. Este objeto tiene las variables: `dynamicLink`, `transactionID`, `errorDescription`, y `rawError`. Si ocurre un error, las variables de error se poblarán y las demás serán nulas. En caso de éxito, las variables relacionadas con el enlace y la transacción se poblarán y las demás serán nulas.

## Uso

Puedes añadir visualmente el botón a `.storyboard` o `.xib` archivos como sigue:

* Añade un UIButton común y cambia su clase a **SpidxButton**, así como su módulo.
* Cambia el tipo del botón a custom, si no lo está.
* Crea una referencia (outlet) y una acción para el botón:

```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
            //Accede a UseCaseData
            print("dynamicLink", data?.dynamicLink)
            print("transactionID", data?.transactionID)
            print("error", data?.rawError)
            print("errorDesc", data?.errorDescription)
        }
    }
}
```

También puedes añadir el botón a una vista programáticamente como sigue:

```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
            //Accede a UseCaseData
            print("dynamicLink", data?.dynamicLink)
            print("transactionID", data?.transactionID)
            print("error", data?.rawError)
            print("errorDesc", data?.errorDescription)
        }
    }

}
```

Ten en cuenta que las proporciones del botón siempre se respetarán en cualquiera de los casos mencionados arriba, es decir, la altura del botón siempre será 1/4 del ancho. Incluso si se pasa otro valor en el constructor del botón, será sobrescrito.

Después de generar el enlace se recomienda que se abra usando el servicio DynamicLink de Firebase, disponible a través de cocoa pods (<https://firebase.google.com/docs/dynamic-links/ios/receive>), o usando algo como:

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

	//Open DynamicLink on Browser
	guard data?.dynamicLink != nil, let url = URL(string: (data?.dynamicLink)!) else {return}

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

lo que abrirá la propia app SPIDX (si el usuario la tiene instalada) o el enlace en cuestión en un navegador, que luego redirigirá al usuario a 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/es/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.
