# iOS (swift)

## Pré-requisitos

Para poder usar o hosted widget no seu aplicativo iOS, certifique-se de que você:

- Pode criar tokens de `access` no seu servidor.
- Sabe como implementar webviews para sua plataforma. Para mais informações, consulte os artigos sobre webview da Apple.


## Configure deeplinks no seu aplicativo iOS

No seu arquivo `Info.plist`, adicione o seguinte código:

```xml Exemplo de Configuração de Deeplink
<key>CFBundleURLTypes</key>
<array>
   <dict>
      <key>CFBundleURLName</key>
      <string>[YOUR IDENTIFIER]</string> <!-- Nome do seu aplicativo -->
      <key>CFBundleURLSchemes</key>
      <array>
         <string>your-url-here</string> <!-- Sua URL de deeplink -->
      </array>
   </dict>
</array>
```

## Manipular eventos na sua webview

No exemplo de código abaixo, você pode ver um exemplo de como escutar e manipular eventos dentro da sua webview.

```swift Exemplo de Manipulação de Webview
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")
                  // Faça algo com o link e a instituição.
                }
                else if navigationAction.request.url.host == "error" {
                    // Se o redirecionamento começar com "error",
                    // Faça algo com o erro.
                } 
                else {
                  // Se o redirecionamento começar com "exit",
                  // Faça algo com a informação de saída.
                }
            }
            decisionHandler(.cancel)
            return
        }
        decisionHandler(.allow)
    }
self.webView.configuration.userContentController.add(self, name: "belvoWidget") // Usado para escutar eventos adicionais
```

## Ouvindo eventos adicionais

Nosso widget para webviews também envia dados adicionais sobre eventos que o usuário encontra ao longo do widget. Por exemplo, quando o usuário vai da tela de seleção de instituição para a tela de login de credenciais, nosso widget enviará um evento.

Os eventos são enviados como payloads JSON com o seguinte esquema:

Evento de Carregamento de Página
```json PAGE_LOAD Event
{
    "eventName": "PAGE_LOAD",
    "metadata":{
        "page": "/institutions", // Página para a qual o usuário é direcionado
        "from": "/consent", // Página onde o usuário estava anteriormente
        "institution_name": "", // Nota: Este campo só aparece DEPOIS que eles selecionaram uma instituição
    }
}
```

Evento de Erro
```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 ouvir esses eventos:

1. Adicione o seguinte protocolo ao seu ViewController.


```swift
WKScriptMessageHandler
```

1. Adicione o seguinte método à sua aplicação:


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

1. Adicione a seguinte linha de código ao final da sua lógica para manipular deep links no seu webview:


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

Feito! Agora você pode ouvir eventos adicionais no seu webview!