Como abrir o controlador de vista Safari a partir de uma Webview (swift)

Tenho uma aplicação que está a usar uma webview e quando certas ligações são carregadas na webview, ela abre essas ligações no Safari. Eu agora quero implementar o controlador de vista Safari (VPC) em vez de inicializá-lo para o aplicativo Safari. Eu fiz pesquisa e olhei para exemplos no VPC; no entanto, tudo o que vejo são aqueles que abrem o VPC a partir do clique de um botão. Alguém tem alguma sugestão para eu olhar ou tentar?

Aqui está o meu código:
func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
    if navigationType == UIWebViewNavigationType.LinkClicked {
        let host = request.URL!.host!;
        if (host != "www.example.com"){
            return true
        } else {
            UIApplication.sharedApplication().openURL(request.URL!)
            return false
        }
    return true

}

func showLinksClicked() {

    let safariVC = SFSafariViewController(URL: NSURL(string: "www.example.com")!)
    self.presentViewController(safariVC, animated: true, completion: nil)
    safariVC.delegate = self    }

func safariViewControllerDidFinish(controller: SFSafariViewController) {
    controller.dismissViewControllerAnimated(true, completion: nil)
}
Author: Mike, 2016-07-05

5 answers

Se estou a perceber correctamente, está a carregar uma página na web, que tem certas ligações agora, quando o utilizador clica na ligação, deseja abrir essa página na SVC. Você pode detectar link clique em webview usando o seguinte método de delegado e, em seguida, abrir SVC a partir daí.

Editar

Com base na pergunta editada posso ver que não está a ligar para o showLinksClicked func , pode chamar esta função à medida que actualizei no código seguinte e deve funcionar.

func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
    if navigationType == UIWebViewNavigationType.LinkClicked {
       self.showLinksClicked()
       return false

    }
    return true;
}


func showLinksClicked() {

    let safariVC = SFSafariViewController(URL: NSURL(string: "www.example.com")!)
    self.presentViewController(safariVC, animated: true, completion: nil)
    safariVC.delegate = self
}

func safariViewControllerDidFinish(controller: SFSafariViewController) {
    controller.dismissViewControllerAnimated(true, completion: nil)
}
 12
Author: Bhumit Mehta, 2017-07-03 19:46:44

Para Swift 3:

Primeiro, importem os Serviços de segurança e integrem o delegado na vossa classe.
import SafariServices

class YourViewController: SFSafariViewControllerDelegate {

Então, para abrir o Safari com o url indicado:

let url = URL(string: "http://www,google.com")!
let controller = SFSafariViewController(url: url)
self.present(controller, animated: true, completion: nil)
controller.delegate = self

E agora você pode implementar o callback delegado para demitir safari quando o usuário estiver terminado:

func safariViewControllerDidFinish(_ controller: SFSafariViewController) {
    controller.dismiss(animated: true, completion: nil)
}
 9
Author: vikzilla, 2016-12-22 19:12:47
Este pedaço de código permitir-lhe-á fazer isto.
let safariVC = SFSafariViewController(URL: NSURL(string: "https://www.google.co.uk")!)
self.presentViewController(safariVC, animated: true, completion: nil)
safariVC.delegate = self

Você pode precisar de adicionar isto ao topo da classe também:

import SafariServices
 6
Author: onemillion, 2016-07-05 12:57:37

Siga os passos:

No seu ficheiro de controlo(por exemplo, Vercontrolador.swift) importem SafarriServices.

import SafariServices

Então onde você quer abrir link write

let controller = SFSafariViewController(URL: NSURL(string: "https://www.google.co.uk")!)
self.presentViewController(controller, animated: true, completion: nil)
controller = self
 2
Author: Dipen Patel, 2016-07-05 13:14:03

Solução Para Swift 4

Passo 1:

Importar um serviço de Safari na sua classe

import SafariServices

Passo 2:

Importar o controlador Sfsafariviewdelegar com o seu controlador de vista

class ViewController: UIViewController,SFSafariViewControllerDelegate {...}

Passo 3:

Crie uma função para abrir o controlador de vista Safari.

 func openSafariVC() {

            let safariVC = SFSafariViewController(url: NSURL(string: "https://www.google.com")! as URL)
            self.present(safariVC, animated: true, completion: nil)
            safariVC.delegate = self
        }

        func safariViewControllerDidFinish(_ controller: SFSafariViewController) {
            controller.dismiss(animated: true, completion: nil)
        }

Passo 4:

Chama a função openSafariVC

openSafariVC()

Nota: não se esqueça de adicionar navegação Controlador com a sua vista Controlador.

Agora o seu SafariVC está pronto para abrir a sua ligação dentro de uma aplicação sem usar UI WebView Oe WKWebView

 0
Author: Anup Gupta, 2018-07-02 21:40:15