如何从 Web 视图打开 Safari 视图控制器(swift)

Posted

技术标签:

【中文标题】如何从 Web 视图打开 Safari 视图控制器(swift)【英文标题】:How to open Safari View Controller from a Webview (swift) 【发布时间】:2016-07-05 12:51:08 【问题描述】:

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

【问题讨论】:

【参考方案1】:

如果我理解正确,当用户单击要在 SVC 中打开这些页面的链接时,您正在 webview 上加载一个页面,该页面现在具有某些链接。您可以使用以下委托方法检测 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)

【讨论】:

我使用与此类似的代码,并且可以正常工作。但是它会在实际的 Safari 应用程序中打开单击的链接,我只想在我自己的应用程序中打开一个 Safari 视图控制器。 @Bhumit Mehta @beginnercoder 你能用你正在使用的代码编辑你的问题吗? @beginnercoder 我已经更新了我的答案,你创建了函数但没有调用它。 这仍然会在 web 视图中打开单击的链接,而不是像我想要的那样打开 SVC。 @Bhumit Mehta @beginnercoder 我已经从委托方法中删除了域条件我认为不满足,你现在可以检查吗?【参考方案2】:

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

【讨论】:

【参考方案3】:

这段代码可以让你做到这一点。

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

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

import SafariServices

【讨论】:

应该将其添加到我当前的代码中吗?还是我把它放在那里而不是我的一些代码?如果我只是在其中添加它,则不会发生任何不同 您必须将其放在 viewDidLoad 或 viewWillAppear 函数中。在我的应用程序中,它附加到一个按钮上,因此当您单击它时,页面会出现在 safari 中。 好的,看看我没有链接到的按钮。当单击应用程序中的某些链接时,我希望它能够打开 SVC。 (例如:联系我们、关于我们等)我的 webview 使用这些链接调用网站,因此我无法控制网站的初始代码【参考方案4】:

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

【讨论】:

有什么方法可以直接打开 SFSafariViewController 这样我就不必调用 openSafariVC()?现在我正在使用 > paste.ubuntu.com/p/RGmFqR76Dv 但我只想使用 SFSafariViewController。 @ShahidGhafoor SFSafariViewController 用于在任何点击事件上打开,否则您可以使用 WKWebView 在 ViewController 中打开网页,因此无需从 VC 重定向到 SFVC。【参考方案5】:

按照步骤操作:

在您的控制器文件(例如 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

【讨论】:

【参考方案6】:

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)
    

编码愉快,谢谢 :)

【讨论】:

【参考方案7】:
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)
 

【讨论】:

以上是关于如何从 Web 视图打开 Safari 视图控制器(swift)的主要内容,如果未能解决你的问题,请参考以下文章

当另一个应用程序打开 Safari 视图控制器时,如何让 branch.io 通用链接工作?

在 iOS 9 上从表视图打开 safari 视图控制器并在 iOS 8 或 7 上在 safari 中打开

iphone应用程序,如何从HTML未录制应用程序的webview中打开safari中的链接

如何在Objective c xib类中导航视图控制器(快速制作)

从 Web 视图打开视图控制器

使用 facebook Safari 视图从登录中删除完成按钮