Entre para a LISTA VIP da Black Friday

00

DIAS

00

HORAS

00

MIN

00

SEG

Clique para saber mais

Tratamento de erro de conexão no IOS

Tratamento de erro de conexão no IOS
andriu-felipe
andriu-felipe

Compartilhe

Nesse artigo, trabalharemos com um aplicativo que lista filmes:

Fomos contratados para desenvolver um aplicativo que contém um catálogo de filmes. Quando o usuário acessa o aplicativo, uma lista com os filmes é apresentada:

Para listar os filmes, foi consumida a API do The Movie DB.

Vamos começar criando o método que vai fazer a requisição para a API do The Movie:


func getFilmes(sucesso: @escaping(_ resultado: [Movie]) -> Void, falha: @escaping(_ erro: Error) -> Void) {  
        Alamofire.request(Session.urlDefault() + "movie/popular?api_key=\(Session.getAuthorizationToken())&language=pt-BR&page=1", method: .get).responseJSON { (resposta) in
            // Verificar retorno do servidor
        }
}

Em seguida, precisamos verificar o status da requisição. Ou seja, se o servidor conseguiu retornar os filmes ou ocorreu alguma falha:


func getFilmes(sucesso: @escaping(_ resultado: [Movie]) -> Void, falha: @escaping(_ erro: Error) -> Void) {

        Alamofire.request(Session.urlDefault() + "movie/popular?api_key=\(Session.getAuthorizationToken())&language=pt-BR&page=1", method: .get).responseJSON { (resposta) in

            switch resposta.result {
            case .success:
                guard let json = resposta.result.value as? Dictionary<String, Any> else { return }
                if let movieList = json["results"] as? Array<Dictionary<String, Any>> {
                    sucesso(Movie.serializeObject(movieList))
                }
                break
            case .failure:
                print(resposta.error!)
                break
            }
        }
}

Vamos criar o método recuperaFilmes e chamá-lo no método viewDidLoad() do ViewController:


func recuperaFilmes() {
        FilmeQueryAPI().getFilmes(sucesso: { (listaDeFilmes) in
            self.filmes = listaDeFilmes
 self.filmesCollectionView.reloadData()
        }) { (error) in
            print(error)
        }
}

Agora temos a lista de filmes:

Legal! Conseguimos exibir os filmes na CollectionView. Criamos uma requisição utilizando o Alamofire, chamamos a API e ela nos devolveu as informações necessárias. Mas, o que acontece se tentarmos utilizar o app e o iPhone não tiver conexão com a internet?

Hum… o aplicativo fica carregando, carregando, mas não aparece a listagem. Será que ocorreu algum erro?

Avisando o usuário

Provavelmente você já utilizou algum aplicativo que te deixou esperando sem saber de fato o que estava acontecendo. Ou pior, você ficou esperando por um bom tempo e na verdade tinha ocorrido uma falha em alguma requisição.

Deixar as pessoas esperando por um longo tempo, e pior, sem mostrar o que está acontecendo é péssimo para a usabilidade do usuário.

Se você já implementou alguma requisição HTTP no seu aplicativo, seja de forma nativa ou utilizando alguma biblioteca como o Alamofire, por exemplo, você já deve ter visto um print(response.error.localizedDescription) espalhado pelo código.

O problema é o print que temos no caso de erro, onde simplesmente estamos imprimindo o erro do servidor no console.

Vamos dar uma olhada na mensagem de erro:

A mensagem nos diz que a conexão com a internet parece estar offline.

Para quem trabalha com desenvolvimento, é ótimo ver essa mensagem no console, assim conseguimos rapidamente saber qual é o problema. Porém, a pessoa ficará aguardando em um load infinito sem saber o que está acontecendo:

Para resolver esse problema, começaremos criando uma classe que implementará um alerta:

import UIKit

class Alerta: NSObject {

    func exibir(_ controller: UIViewController, _ titulo: String, _ mensagem: String) {
        let alerta = UIAlertController(title: titulo, message: mensagem, preferredStyle: .alert)
        let botao = UIAlertAction(title: "Ok", style: .default, handler: nil)
        alerta.addAction(botao)

        controller.present(alerta, animated: true, completion: nil)
    }

}

Agora que temos essa classe, no callback de erro do método recuperaFilmes() vamos implementá-la:


func recuperaFilmes() {
        FilmeQueryAPI().getFilmes(sucesso: { (listaDeFilmes) in
            self.filmes = listaDeFilmes
            self.filmesCollectionView.reloadData()
        }) { (error) in
            Alerta().exibir(self, "Atenção", error.localizedDescription)
        }
}

Vamos testar novamente:

Ótimo, agora estamos apresentando um alerta para o usuário indicando qual foi o problema.

Banner da promoção da black friday, com os dizeres: A Black Friday Alura está chegando. Faça parte da Lista VIP, receba o maior desconto do ano em primeira mão e garanta bônus exclusivos. Quero ser VIP

Requisições e avisos

Fazer requisições para buscar informações é uma tarefa comum no desenvolvimento. Seja em aplicações mobile, web, e até mesmo em algumas aplicações desktops.

Porém, algumas vezes não existe a conexão com a internet. Então como fazemos? Uma forma, é mostrar uma mensagem para o usuário falando que a conexão com a internet é requerida.

Além dessa forma, existem diversas outras que podemos utilizar para tratar esse tipo de erro. Como, por exemplo, fazendo um cache da última requisição e utilizar esses dados para compor a tela que desejamos.

Aqui na Alura, temos uma formação IOS. Nela você aprenderá técnicas de construção de layouts que ajudem na experiência do usuário, formatar dados como CPF, CNPJ, e até comunicação com web services.

Veja outros artigos sobre Mobile