Webview Safari中的Swift Open Link

Webview Safari中的Swift Open Link,webview,swift,safari,Webview,Swift,Safari,我目前正在一个网络视图中打开我应用程序中的链接,但我正在寻找一个选项,以便在Safari中打开链接。它不是“烘焙到Swift”,但你可以使用标准的UIKit方法来完成。看看UIApplication的(已弃用)和 Swift 4+Swift 5(iOS 10及以上版本) Swift 3(iOS 9及以下版本) Swift 2.2 guard let url = URL(string: "https://stackoverflow.com") else { return } UIApplicati

我目前正在一个
网络视图中打开我应用程序中的链接,但我正在寻找一个选项,以便在Safari中打开链接。

它不是“烘焙到Swift”,但你可以使用标准的
UIKit
方法来完成。看看UIApplication的(已弃用)和

Swift 4+Swift 5(iOS 10及以上版本)

Swift 3(iOS 9及以下版本)

Swift 2.2

guard let url = URL(string: "https://stackoverflow.com") else { return }
UIApplication.sharedApplication().openURL(url)    
UIApplication.shared.open(URL(string: "http://www.stackoverflow.com")!, options: [:], completionHandler: nil)
为Swift 4更新:(归功于Marco Weber)

或者使用
guard
,使用更多的swift风格:

guard let requestUrl = NSURL(string: "http://www.iSecurityPlus.com") else {
    return
}

UIApplication.shared.openURL(requestUrl as URL) 
Swift 3:

您可以通过以下方式将NSURL隐式检查为可选:

if let requestUrl = NSURL(string: "http://www.iSecurityPlus.com") {
     UIApplication.sharedApplication().openURL(requestUrl)
}
在Swift 1.2中:

@IBAction func openLink {    
    let pth = "http://www.google.com"
    if let url = NSURL(string: pth){
        UIApplication.sharedApplication().openURL(url)
}
在Swift 2.0中:

UIApplication.sharedApplication().openURL(NSURL(string: "http://stackoverflow.com")!)

iOS 9及更高版本新增功能,您可以向用户提供
SFSafariViewController
(请参阅文档)。基本上,您可以获得将用户发送到Safari的所有好处,而无需让他们离开您的应用程序。要使用新的SFSafariViewController,只需执行以下操作:

import SafariServices
在事件处理程序中的某个位置,向用户显示safari视图控制器,如下所示:

let svc = SFSafariViewController(url: url)
present(svc, animated: true, completion: nil)
safari视图将如下所示:

let svc = SFSafariViewController(url: url)
present(svc, animated: true, completion: nil)

Swift 3和IOS 10.2

guard let url = URL(string: "https://stackoverflow.com") else { return }
UIApplication.sharedApplication().openURL(url)    
UIApplication.shared.open(URL(string: "http://www.stackoverflow.com")!, options: [:], completionHandler: nil)
Swift 3和IOS 10.2


由于iOS 10,您应该使用:

guard let url = URL(string: linkUrlString) else {
    return
}
    
if #available(iOS 10.0, *) {
    UIApplication.shared.open(url, options: [:], completionHandler: nil)
} else {
    UIApplication.shared.openURL(url)
}
IOS 11.2 Swift 3.1-4

let webView = WKWebView()

override func viewDidLoad() {
    super.viewDidLoad()
    guard let url = URL(string: "https://www.google.com") else { return }
    webView.frame = view.bounds
    webView.navigationDelegate = self
    webView.load(URLRequest(url: url))
    webView.autoresizingMask = [.flexibleWidth,.flexibleHeight]
    view.addSubview(webView)
}

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
    if navigationAction.navigationType == .linkActivated  {
        if let url = navigationAction.request.url,
            let host = url.host, !host.hasPrefix("www.google.com"),
            UIApplication.shared.canOpenURL(url) {
            UIApplication.shared.open(url)
            print(url)
            print("Redirected to browser. No need to open it locally")
            decisionHandler(.cancel)
        } else {
            print("Open it locally")
            decisionHandler(.allow)
        }
    } else {
        print("not a user click")
        decisionHandler(.allow)
    }
}

Swift 5

斯威夫特5

if let url = URL(string: "https://www.google.com") {
    UIApplication.shared.open(url)
}

Amit,不,因为它是显式完成的,正如我所解释的,如果让requestUrl=…是的,有很多方法可以做事情,就可以保证requestUrl存在。了解为什么你应该在某种情况下使用某些代码,而不是固执地说“我是对的,所以你是错的”心态。看起来你对编程还不熟悉,这是我给你的建议。阿米特:不,它不起作用,你错了。在Swift 2或1.2中。难怪requestUrl不是可选的,所以不能用!打开它!。与Mike S的方法相比,我更喜欢此方法,因为您在发送请求之前会执行nil检查。对于Swift4更新:
if let requestUrl=NSURL(字符串:http://www.iSecurityPlus.com“”{UIApplication.shared.openURL(requestUrl作为URL)}
如果我们像这样添加一些购买URL,app store是否有机会?在iOS 10.0中,您现在必须添加选项和处理程序:UIApplication.shared.open(URL(字符串:)!,选项:[:],completionHandler:nil)@gabicuesta您实际上不必提供选项和completionHandler,它们默认为[:]如果设置为“默认浏览器”,则分别为nil和ios14不在Safari中打开链接“设置为其他版本,如谷歌Chrome等。但请注意,使用此版本将停止你的应用程序在iOS 9及以前版本上运行,除非你进行版本检查。这太棒了。谢谢每个想在应用程序扩展中显示Safari浏览器的人都应该使用此代码。禁止访问应用程序扩展中的
sharedApplication
属性。更多信息:杰出的解决方案苹果有时会因为使用旧的openURL方法而拒绝商店中的应用程序。这现在应该是首选的解决方案。
if let url = URL(string: "https://www.google.com") {
    UIApplication.shared.open(url)
}