如何从 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中的链接