Safari中的Swift Open Link


Answers:


348

它不是“嵌入到Swift中”,但是您可以使用标准UIKit方法来完成。看一下UIApplication的(已弃用)和。openUrl(_:) open(_:options:completionHandler:)

Swift 4 + Swift 5(iOS 10及更高版本)

guard let url = URL(string: "https://stackoverflow.com") else { return }
UIApplication.shared.open(url)

Swift 3(iOS 9及更低版本)

guard let url = URL(string: "https://stackoverflow.com") else { return }
UIApplication.shared.openURL(url)

斯威夫特2.2

guard let url = URL(string: "https://stackoverflow.com") else { return }
UIApplication.sharedApplication().openURL(url)    

如果我们添加一些购买网址,那么应用商店有机会吗?

8
在iOS 10.0中,您现在必须添加选项和处理程序:UIApplication.shared.open(URL(string:“ google.com”)!,选项:[:],completionHandler:无)
gabicuesta

1
@gabicuesta您实际上不必提供选项和completionHandler,它们默认分别为[:]和nil
Jeremy

79

iOS 9及更高版本中的新功能,您可以向用户显示SFSafariViewController(请参见此处的文档)。基本上,您可以获得将用户发送到Safari而无需离开他们的应用程序的所有好处。要仅使用新的SFSafariViewController:

import SafariServices

在事件处理程序中的某个位置,向用户展示野生动物园视图控制器,如下所示:

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

野生动物园视图将如下所示:

在此处输入图片说明


3
这太棒了。谢谢!想要在应用程序扩展中显示Safari浏览器的每个人都应使用此代码。sharedApplication禁止访问应用扩展中的属性。欲了解更多:developer.apple.com/library/archive/documentation/General/...
巴兰埃姆雷

1
出色的解决方案
Mutawe

1
苹果有时会拒绝商店中使用旧版openURL方法的应用程序。现在,这应该是首选的解决方案。
离线

19

Swift 4更新:(提供给Marco Weber)

if let requestUrl = NSURL(string: "http://www.iSecurityPlus.com") {
     UIApplication.shared.openURL(requestUrl as URL) 
}

或者使用以下更快速的样式guard

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

UIApplication.shared.openURL(requestUrl as URL) 

斯威夫特3:

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

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

4
艾米特,没有,因为它明确地做,因为我已经解释这是保证requestUrl存在,如果让requestUrl = ...
CodeOverRide

2
是的,有很多方法可以做事。了解为什么在某种情况下应该使用某些代码,而不要固执地说“我是对的,所以你是错的”。看来您是编程新手,这是我对您孩子的建议。
CodeOverRide

3
阿米特:不,这行不通,你只是错了。在Swift 2或1.2中。难怪,requestUrl不是可选的,因此您不能使用!对其进行拆包。
Gusutafu

2
我比Mike S更喜欢这种方法,因为您在发送请求之前先进行了nil检查。
Nikolaj Nielsen 2015年

1
已针对Swift4更新:if let requestUrl = NSURL(string: "http://www.iSecurityPlus.com") { UIApplication.shared.openURL(requestUrl as URL) }
Marco Weber

12

Swift 3和iOS 10.2

UIApplication.shared.open(URL(string: "http://www.stackoverflow.com")!, options: [:], completionHandler: nil)

Swift 3和iOS 10.2


但是请注意,使用此版本将停止您的应用在iOS 9及更高版本上的运行,除非您对其版本进行检查
-CupawnTae

11

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


2

在Swift 1.2中:

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

1

在Swift 2.0中:

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

-1

iOS 11.2迅捷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)
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.