Swift Open Link no Safari

150

No momento, estou abrindo o link no meu aplicativo em um WebView, mas estou procurando uma opção para abrir o link no Safari .

Fabian Boulegue
fonte

Respostas:

348

Não é "feito para o Swift", mas você pode usar UIKitmétodos padrão para fazer isso. Dê uma olhada no UIApplication (obsoleto) e .openUrl(_:) open(_:options:completionHandler:)

Swift 4 + Swift 5 (iOS 10 e superior)

guard let url = URL(string: "https://stackoverflow.com") else { return }
UIApplication.shared.open(url)

Swift 3 (iOS 9 e abaixo)

guard let url = URL(string: "https://stackoverflow.com") else { return }
UIApplication.shared.openURL(url)

Swift 2.2

guard let url = URL(string: "https://stackoverflow.com") else { return }
UIApplication.sharedApplication().openURL(url)    
Mike S
fonte
Existe alguma chance da loja de aplicativos se adicionarmos um URL de compra como este?
Jan
8
Em iOS 10,0 agora você deve adicionar opções e manipulador: UIApplication.shared.open (URL (string: " google.com" ) !, opções: [:], completionHandler: nil)
gabicuesta
1
@gabicuesta Você realmente não tem que fornecer opções e completionHandler, eles padrão para [:] e zero, respectivamente
Jeremy
79

Novo no iOS 9 e superior, você pode apresentar ao usuário um SFSafariViewController(consulte a documentação aqui ). Basicamente, você obtém todos os benefícios de enviar o usuário ao Safari sem fazê-lo sair do aplicativo. Para usar o novo SFSafariViewController apenas:

import SafariServices

e em algum lugar de um manipulador de eventos, o usuário pode apresentar o controlador de visualização safari como este:

let svc = SFSafariViewController(url: url)
present(svc, animated: true, completion: nil)

A visualização do safari será mais ou menos assim:

insira a descrição da imagem aqui

manncito
fonte
3
Isso é incrível. Obrigado! Todo mundo que quiser mostrar o navegador Safari em uma extensão de aplicativo deve usar esse código. sharedApplicationÉ proibido acessar a propriedade na extensão do aplicativo. Para mais: developer.apple.com/library/archive/documentation/General/…
Baran Emre
1
solução excelente
Mutawe 09/07/19
1
Às vezes, a Apple está rejeitando aplicativos da loja por usar o antigo método openURL. Agora, essa deve ser a solução preferida.
disconnectionist
19

ATUALIZADO para Swift 4: (crédito para Marco Weber)

if let requestUrl = NSURL(string: "http://www.iSecurityPlus.com") {
     UIApplication.shared.openURL(requestUrl as URL) 
}

OU escolha um estilo mais rápido usando guard:

guard let requestUrl = NSURL(string: "http://www.iSecurityPlus.com") else {
    return
}

UIApplication.shared.openURL(requestUrl as URL) 

Swift 3:

Você pode verificar NSURL como opcional implicitamente:

if let requestUrl = NSURL(string: "http://www.iSecurityPlus.com") {
     UIApplication.sharedApplication().openURL(requestUrl)
}
CodeOverRide
fonte
4
Amit, Não, porque ele é feito de forma explícita como já expliquei, é garantia de que requestUrl existir se deixe requestUrl = ...
CodeOverRide
2
sim, há muitas maneiras de fazer as coisas. Aprenda o motivo pelo qual você deve usar determinado código em uma situação, em vez de ser um pirralho teimoso, dizendo: "Estou certo, portanto você está errado". Parece que você é novo na programação, este é meu conselho para você, garoto.
CodeOverRide 26/06
3
Amit: Não, não funciona, você está simplesmente errado. No Swift 2 ou 1.2. E não é de admirar, requestUrl não é opcional, portanto você não pode desembrulhá-lo com!
Gusutafu 15/09/2015
2
Eu gosto desse método melhor que o do Mike S, porque você faz a verificação nula antes de enviar a solicitação.
Nikolaj Nielsen
1
atualizado para Swift4:if let requestUrl = NSURL(string: "http://www.iSecurityPlus.com") { UIApplication.shared.openURL(requestUrl as URL) }
Marco Weber
12

Swift 3 e IOS 10.2

UIApplication.shared.open(URL(string: "http://www.stackoverflow.com")!, options: [:], completionHandler: nil)

Swift 3 e IOS 10.2

ramchandra f—
fonte
Mas note que o uso desta versão vai parar o seu aplicativo em execução no iOS 9 e anterior, a menos que a versão verificá-lo
CupawnTae
11

desde o iOS 10 você deve usar:

guard let url = URL(string: linkUrlString) else {
    return
}
    
if #available(iOS 10.0, *) {
    UIApplication.shared.open(url, options: [:], completionHandler: nil)
} else {
    UIApplication.shared.openURL(url)
}
Samira Ekrami
fonte
10

Swift 5

Swift 5: Marque usando canOpneURLse é válido e está aberto.

guard let url = URL(string: "https://iosdevcenters.blogspot.com/") else {
     return
}

if UIApplication.shared.canOpenURL(url) {
     UIApplication.shared.open(url, options: [:], completionHandler: nil)
}
Kirit Modi
fonte
2

No Swift 1.2:

@IBAction func openLink {    
    let pth = "http://www.google.com"
    if let url = NSURL(string: pth){
        UIApplication.sharedApplication().openURL(url)
}
Amit Kalra
fonte
1

No Swift 2.0:

UIApplication.sharedApplication().openURL(NSURL(string: "http://stackoverflow.com")!)
Kaptain
fonte
-1

IOS 11.2 Swift 3.1- 4

let webView = WKWebView()

override func viewDidLoad() {
    super.viewDidLoad()
    guard let url = URL(string: "https://www.google.com") else { return }
    webView.frame = view.bounds
    webView.navigationDelegate = self
    webView.load(URLRequest(url: url))
    webView.autoresizingMask = [.flexibleWidth,.flexibleHeight]
    view.addSubview(webView)
}

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
    if navigationAction.navigationType == .linkActivated  {
        if let url = navigationAction.request.url,
            let host = url.host, !host.hasPrefix("www.google.com"),
            UIApplication.shared.canOpenURL(url) {
            UIApplication.shared.open(url)
            print(url)
            print("Redirected to browser. No need to open it locally")
            decisionHandler(.cancel)
        } else {
            print("Open it locally")
            decisionHandler(.allow)
        }
    } else {
        print("not a user click")
        decisionHandler(.allow)
    }
}
guevara lopez
fonte