# iOS (swift)

## Prerrequisitos

Para poder usar el hosted widget en tu aplicación iOS, asegúrate de que:

- Puedes crear tokens de `access` en tu servidor.
- Sabes cómo implementar webviews para tu plataforma. Para más información, consulta los artículos sobre webview de Apple.


## Configura deeplinks en tu aplicación iOS

En tu archivo `Info.plist`, agrega el siguiente código:

```xml Ejemplo de Configuración de Deeplink
<key>CFBundleURLTypes</key>
<array>
   <dict>
      <key>CFBundleURLName</key>
      <string>[YOUR IDENTIFIER]</string> <!-- El nombre de tu app -->
      <key>CFBundleURLSchemes</key>
      <array>
         <string>your-url-here</string> <!-- Tu URL de deeplink -->
      </array>
   </dict>
</array>
```

## Manejar eventos en tu webview

En el siguiente ejemplo de código puedes ver un ejemplo de cómo escuchar y manejar eventos dentro de tu webview.

```swift Webview Handling Example
public func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Swift.Void) {
        if(navigationAction.navigationType == .other) {
            if navigationAction.request.url != nil {
                if navigationAction.request.url.host == "success" {
                    var url = navigationAction.request.url
                    var link = self.getParameterFrom(url: url, param: "link")
                    var institution = self.getParameterFrom(url: url, param: "institution")
                  // Haz algo con el link y la institución.
                }
                else if navigationAction.request.url.host == "error" {
                    // Si el redireccionamiento comienza con "error",
                    // Haz algo con el error.
                } 
                else {
                  // Si el redireccionamiento comienza con "exit",
                  // Haz algo con la información de salida.
                }
            }
            decisionHandler(.cancel)
            return
        }
        decisionHandler(.allow)
    }
self.webView.configuration.userContentController.add(self, name: "belvoWidget") // Usado para escuchar eventos adicionales
```

## Escuchando eventos adicionales

Nuestro widget para webviews también envía datos adicionales sobre los eventos que el usuario encuentra a lo largo del widget. Por ejemplo, cuando el usuario pasa de la pantalla de selección de institución a la pantalla de inicio de sesión de credenciales, nuestro widget enviará un evento.

Los eventos se envían como cargas JSON con el siguiente esquema:

Evento de Carga de Página
```json PAGE_LOAD Event
{
    "eventName": "PAGE_LOAD",
    "metadata":{
        "page": "/institutions", // Página a la que se dirige el usuario
        "from": "/consent", // Página donde estaba el usuario previamente
        "institution_name": "", // Nota: Este campo solo aparece DESPUÉS de que han seleccionado una institución
    }
}
```

Evento de Error
```json ERROR Event
{
  "eventName": "ERROR",
  "request_id": "UUID",
  "meta_data": {
    "error_code": "login_error",
    "error_message": "Invalid credentials provided to login to the institution",
    "institution_name": "bancoazteca_mx_retail",
    "timestamp": "2020-04-27T19:09:23.918Z"
  }
}
```

Para escuchar estos eventos:

1. Agrega el siguiente protocolo a tu ViewController.


```swift
WKScriptMessageHandler
```

1. Agrega el siguiente método a tu aplicación:


```swift
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        
    let body = "EVENT DATA: " + (message.body as! String)
    print( body as Any )
        
}
```

1. Agrega la siguiente línea de código al final de tu lógica para manejar enlaces profundos en tu webview:


```kotlin
belvoWebview.configuration.userContentController.add(self, name: "belvoWidget") // Usado para escuchar eventos adicionales
```

¡Hecho! ¡Ahora puedes escuchar eventos adicionales en tu webview!