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

时间:2016-07-05 12:51:08

标签: ios swift uiwebview 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)
}

7 个答案:

答案 0 :(得分:14)

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

修改

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

<textField pattern="MMM d, yyyy h:mm:ss a z">
            <reportElement x="0" y="1" width="280" height="21" isRemoveLineWhenBlank="true" uuid="3f452153-41b0-4296-84b9-5a78825a18dc"/>
            <textElement verticalAlignment="Middle">
                <font isItalic="true"/>
            </textElement>
            <textFieldExpression><![CDATA["Report Generated on: "+new java.util.Date()]]></textFieldExpression>
        </textField>

答案 1 :(得分:13)

对于Swift 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)
}

答案 2 :(得分:8)

这段代码可以让你这样做。

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

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

import SafariServices

答案 3 :(得分:2)

按照以下步骤操作:

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

import SafariServices

然后在哪里打开链接写

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

答案 4 :(得分:1)

  

Swift 4解决方案

第1步:

在您的课程中导入Safari服务

import SafariServices

第2步:

使用您的View Controller导入SFSafariViewControllerDelegate

class ViewController: UIViewController,SFSafariViewControllerDelegate {...}

第3步:

创建一个功能以打开Safari View Controller。

 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

的情况下打开应用程序中的链接了。

答案 5 :(得分:0)

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

快乐的编码,谢谢:)

答案 6 :(得分: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)
 }
}