Swift открыть ссылку в Safari

в настоящее время я открываю ссылку в своем приложении в WebView, но я ищу возможность открыть ссылку в сафари.

8 ответов


это не "запеченный в Swift", но вы можете использовать стандартный UIKit методы для этого. Взгляните на UIApplication ' s openUrl().

Swift 4

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

Swift 3

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

Swift 2.2

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

New с iOS 9 и выше вы можете представить пользователю SFSafariViewController (см. документацию здесь). В основном вы получаете все преимущества отправки пользователя в Safari, не заставляя их покидать ваше приложение. Чтобы использовать новый SFSafariViewController просто:

import SafariServices

и где-то в обработчике событий представить пользователю контроллер вида safari, как это:

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

вид safari будет выглядеть примерно так это:

enter image description here


обновлено для Swift 4: (кредит Марко Веберу)

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) 

Swift 3:

вы можете проверить NSURL как необязательный неявно:

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

Swift 3 & IOS 10.2

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

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

}