如何从Webview(swift)打开Safari View Controller

beg*_*der 11 uiwebview ios swift sfsafariviewcontroller

我有一个当前使用webview的应用程序,当在webview中单击某些链接时,它会在Safari中打开这些链接.我现在想要实现Safari视图控制器(SVC),而不是将其启动到Safari应用程序.我做过研究,看过SVC的例子; 但是,我所看到的只是通过点击按钮打开SVC.有没有人有任何建议让我看看或尝试?

这是我的一些代码:

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)
}
Run Code Online (Sandbox Code Playgroud)

Bhu*_*hta 16

如果我正确理解您正在加载webview上的页面,当用户点击链接时,您想要在SVC中打开这些页面时,该页面具有某些链接.您可以使用以下委托方法检测webview中的链接点击,然后从那里打开SVC.

编辑

根据编辑过的问题,我可以看到你没有调用showLinksClicked func,你可以调用这个函数,因为我已经在下面的代码中更新了它应该可以工作.

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)
}
Run Code Online (Sandbox Code Playgroud)


vik*_*lla 13

对于Swift 3:

首先,导入SafariServices并将委托集成到您的类中:

import SafariServices

class YourViewController: SFSafariViewControllerDelegate {
Run Code Online (Sandbox Code Playgroud)

然后,使用指定的URL打开Safari:

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

现在,您可以实现委托回调以在用户完成时解除safari:

func safariViewControllerDidFinish(_ controller: SFSafariViewController) {
    controller.dismiss(animated: true, completion: nil)
}
Run Code Online (Sandbox Code Playgroud)


one*_*ion 8

这段代码将允许您执行此操作.

let safariVC = SFSafariViewController(URL: NSURL(string: "https://www.google.co.uk")!)
self.presentViewController(safariVC, animated: true, completion: nil)
safariVC.delegate = self
Run Code Online (Sandbox Code Playgroud)

您可能还需要将其添加到类的顶部:

import SafariServices
Run Code Online (Sandbox Code Playgroud)