Coisas simples: Abrindo url dentro do app iOS c/ Swift

Vitor Navarro
Codando a vida adoidado
3 min readMay 4, 2018

Existem situações que incomodam, principalmente quando tentamos fazer coisas "simples" e fazemos uma confusão digna de crianças numa cozinha.

Designed by Teksomolika / Freepik

Mesmo com toda a frustação e decepção que surge com qualquer coisa que seja que tenha virado o mais puro caos, eu aprendi a aproveitar e canalizar essa motivação para algo e eis que vem o post de hoje. Vamos então pegar a farinha, o leite e as gotas de chocolate e tacar a mão no bowl pra ver o que sai.

O plano é simples:

  1. Carregar um site usando HTTP, não o HTTPs
  2. O app deve funcionar em 8.3+

Problemas:

  1. O WKWebView, que substitui a UIWebView, está disponível desde de o 8.0 MAS existe um lindo bug que destroí o uso da view via interface builder se você for um desenvolvedor normal e der suporte para outras versões que não a 11.0.

error: Class Unavailable: WKWebView before iOS 11.0 (NSCoding support was broken in previous versions)

2. O uso livre de HTTP foi bloqueado a partir do iOS 9.0, esquecer do NSAppTransportSecurity com Allow Arbitrary Loads é fatal.

Mãos no código

Crie um projeto qualquer, pode ser single view app por exemplo. Considere aqui o seguinte fato, já temos um ViewController no Main.storyboard criado por padrão então vamos usar esse cara mesmo.

O que faríamos?

Inserir a WKWebView como view principal do ViewController e carregar a url desejada.

O que muda?

Instanciar o WKWebView no código, inclusive existe um exemplo na própria documentação da Apple, mas faço questão de deixar o atalho abaixo 😉

import UIKit
import WebKit

class WebViewController: UIViewController, WKUIDelegate {

var webView: WKWebView!

override func loadView() {
let webConfiguration = WKWebViewConfiguration()
webView = WKWebView(frame: .zero, configuration: webConfiguration)
webView.uiDelegate = self
view = webView
}

override func viewDidLoad() {
super.viewDidLoad()

let url = URL(string: "http://www.bbc.com/")
let request = URLRequest(url: url!)
webView.load(request)

}

}

O que ficou faltando?

Para concluir é necessário permitir o acesso de URLs sem segurança, uma forma simples é usar Allow Arbitrary Loads do NSAppTransportSecurity no Info.plist

Info.plist com App Transport Security Settings e Allow Arbitrary Loads

Uma alternativa é usar a nova chave NSAllowsArbitraryLoadsInWebContent para permitir apenas o uso de HTTP através do WKWebView. Ou ainda fazer uma configuração de permissão apenas para um servidor específico.

Info.plist com NSExceptionAllowsInsecureHTTPLoads

Na imagem de exmplo apenas requisições par ao meu site estão permitidas, apenas para ficar mais claro aqui vai o xml:

<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>vnavarro.com.br</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
<key>NSAllowsArbitraryLoads</key>
<false/>
</dict>

O App Transport Security (ATS) tem uma configuração bem complexa de permissionamento para requisições. Uma investigada mais profunda de acordo com a necessidade é recomendado.

E rodando está

Web view carregando o http://www.bbc.com

Uma das coisas mais simples a se fazer mas que contém uma profundidade maior do que imaginamos.

E você, já enfrentou problemas com carregamento de urls? Fale mais sobre suas experiências no mundo mobile nos comentários abaixo.

--

--

Vitor Navarro
Codando a vida adoidado

Hi I’m software engineer / game developer, technology enthusiast that loves books, games and being with friends amongst other things.