12

我有一个当前正在使用 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)
}
4

7 回答 7

17

如果我理解正确,您正在 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: URL(string: "www.google.com")!)
    present(safariVC, animated: true, completion: nil)
    safariVC.delegate = self
}

func safariViewControllerDidFinish(controller: SFSafariViewController) {
    controller.dismissViewControllerAnimated(true, completion: nil)
}
于 2016-07-05T13:13:29.510 回答
13

对于斯威夫特 3:

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

import SafariServices

class YourViewController: SFSafariViewControllerDelegate {

然后,使用指定的 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

现在您可以实现委托回调以在用户完成后关闭 Safari:

func safariViewControllerDidFinish(_ controller: SFSafariViewController) {
    controller.dismiss(animated: true, completion: nil)
}
于 2016-12-22T19:12:47.357 回答
9

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

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

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

import SafariServices
于 2016-07-05T12:57:37.950 回答
3

Swift 4 的解决方案

步骤1:

在你的课堂上导入 Safari 服务

import SafariServices

第2步:

使用您的视图控制器导入 SFSafariViewControllerDelegate

class ViewController: UIViewController,SFSafariViewControllerDelegate {...}

第 3 步:

创建一个函数来打开 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)
        }

第4步:

调用函数 openSafariVC

openSafariVC()

注意:不要忘记使用视图控制器添加导航控制器。

现在您的 SafariVC 已准备好在应用程序中打开您的链接,而无需使用UIWebView Oe WKWebView

于 2018-07-02T21:40:15.690 回答
2

按照步骤 :

在您的控制器文件(例如 ViewController.swift)上导入 SafariServices。

import SafariServices

然后在你想打开链接的地方写

let controller = SFSafariViewController(URL: NSURL(string: "https://www.google.co.uk")!)
self.presentViewController(controller, animated: true, completion: nil)
controller = self
于 2016-07-05T13:14:03.507 回答
0

斯威夫特 4.2

这就是您可以在应用程序中打开 Safari 浏览器的方式。

import SafariServices

每当你想打开,就像明智的

@IBAction func btnOpenWebTapped(_ sender: UIButton) {
    self.openWeb(contentLink: "https://www.google.com")
}

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    self.openWeb(contentLink: "https://www.google.com")
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
     self.openWeb(contentLink: "https://www.google.com")
}

通过编写自定义函数就像你可以自定义的属性SFSafariViewController, preferredBarTintColor, preferredControlTintColor, dismissButtonStyle, barCollapsingEnabled

func openWeb(contentLink : String){
     let url = URL(string: contentLink)!
     let controller = SFSafariViewController(url: url)
     controller.preferredBarTintColor = UIColor.darkGray
     controller.preferredControlTintColor = UIColor.groupTableViewBackground
     controller.dismissButtonStyle = .close
     controller.configuration.barCollapsingEnabled = true
     self.present(controller, animated: true, completion: nil)
     controller.delegate = self
}

最后也是最重要的事情是不要忘记将委托SFSafariViewController与您的视图控制器绑定。你可以通过下面提到的extension代码来做到这一点。

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

快乐的编码谢谢你:)

于 2019-10-22T07:54:59.423 回答
0
import SafariServices

class ViewController: UIViewController, SFSafariViewControllerDelegate {

 override func viewDidLoad() {
     super.viewDidLoad()
     DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
         let url = URL(string: "http://www.google.com")!
         let controller = SFSafariViewController(url: url)
         self.present(controller, animated: true, completion: nil)
         controller.delegate = self
     }
 }

 func safariViewControllerDidFinish(_ controller: SFSafariViewController) {
     dismiss(animated: true)
 }
}
于 2020-12-21T07:15:16.147 回答