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)
}
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)
}
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)
}
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
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
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