Swift Open Link in Safari


150

Ich WebViewöffne derzeit den Link in meiner App in a , suche aber nach einer Option zum Öffnen des Links in stattdessen Safari .

Antworten:


348

Es ist nicht "in Swift eingebrannt", aber Sie können Standardmethoden UIKitverwenden, um es zu tun. Schauen Sie sich UIApplication's (veraltet) und an .openUrl(_:) open(_:options:completionHandler:)

Swift 4 + Swift 5 (iOS 10 und höher)

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

Swift 3 (iOS 9 und niedriger)

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)    

Gibt es eine Chance aus dem App Store, wenn wir eine solche Einkaufs-URL hinzufügen?
Januar

8
In iOS 10.0 müssen Sie jetzt Optionen und Handler hinzufügen: UIApplication.shared.open (URL (Zeichenfolge: " google.com" )!, Optionen: [:], CompletionHandler: nil)
gabicuesta

1
@gabicuesta Sie müssen eigentlich keine Optionen und VervollständigungHandler angeben, sie sind standardmäßig [:] bzw. Null
Jeremy

79

Neu mit iOS 9 und höher können Sie dem Benutzer ein SFSafariViewController(siehe Dokumentation hier ) präsentieren. Grundsätzlich erhalten Sie alle Vorteile, wenn Sie den Benutzer an Safari senden, ohne dass er Ihre App verlässt. So verwenden Sie den neuen SFSafariViewController einfach:

import SafariServices

und irgendwo in einem Event-Handler präsentieren Sie dem Benutzer den Safari View Controller wie folgt:

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

Die Safari-Ansicht sieht ungefähr so ​​aus:

Geben Sie hier die Bildbeschreibung ein


3
Das ist fantastisch. Vielen Dank! Jeder, der den Safari-Browser in einer App-Erweiterung anzeigen möchte, sollte diesen Code verwenden. Der Zugriff auf die sharedApplicationEigenschaft in der App-Erweiterung ist verboten. Für mehr: developer.apple.com/library/archive/documentation/General/…
Baran Emre

1
hervorragende Lösung
Mutawe

1
Apple lehnt manchmal Apps aus dem Store ab, weil sie die alte openURL-Methode verwendet haben. Dies sollte nun die bevorzugte Lösung sein.
disconnectionist

19

AKTUALISIERT für Swift 4: (Dank an Marco Weber)

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

ODER gehen Sie mit mehr schnellem Stil mit guard:

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

UIApplication.shared.openURL(requestUrl as URL) 

Swift 3:

Sie können NSURL implizit als optional überprüfen, indem Sie:

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

4
Amit, nein, weil es explizit gemacht wird, wie ich erklärt habe, ist es garantiert, dass requestUrl existiert, wenn requestUrl = ...
CodeOverRide

2
Ja, es gibt viele Möglichkeiten, Dinge zu tun. Erfahren Sie, warum Sie in einer Situation bestimmten Code verwenden sollten, anstatt ein hartnäckiger Gör zu sein, der sagt: "Ich habe Recht, daher Ihre falsche" Mentalität. Scheint, als ob Sie neu in der Programmierung sind. Dies ist mein Rat an Sie, Kind.
CodeOverRide

3
Amit: Nein, es funktioniert nicht, du liegst einfach falsch. In Swift 2 oder 1.2. Und kein Wunder, requestUrl ist keine Option, sodass Sie es nicht auspacken können!
Gusutafu

2
Ich mag diese Methode besser als die von Mike S, weil Sie die Nullprüfung durchführen, bevor Sie die Anfrage senden.
Nikolaj Nielsen

1
aktualisiert für 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


Beachten Sie jedoch, dass die Verwendung dieser Version die Ausführung Ihrer App unter iOS 9 und früheren Versionen
stoppt

11

seit iOS 10 sollten Sie verwenden:

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

In Swift 1.2:

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

1

In Swift 2.0:

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

-1

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)
    }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.