Swift Open Link w Safari


150

Obecnie otwieram łącze w mojej aplikacji w a WebView, ale szukam opcji, aby zamiast tego otworzyć łącze w Safari .

Odpowiedzi:


348

Nie jest to „zapieczętowane w Swifcie”, ale możesz to zrobić za pomocą standardowych UIKitmetod. Spójrz na pliki UIApplication (przestarzałe) i .openUrl(_:) open(_:options:completionHandler:)

Swift 4 + Swift 5 (iOS 10 i nowsze)

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

Swift 3 (iOS 9 i starsze)

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)    

Czy jest jakaś szansa ze sklepu z aplikacjami, jeśli dodamy taki adres URL zakupów?
styczeń

8
W iOS 10.0 musisz teraz dodać opcje i moduł obsługi: UIApplication.shared.open (URL (string: " google.com" ) !, opcje: [:],
completeHandler

1
@gabicuesta W rzeczywistości nie musisz podawać opcji i CompleteHandler, domyślnie są to odpowiednio [:] i nil
Jeremy

79

Nowość w systemie iOS 9 i nowszym możesz przedstawić użytkownikowi SFSafariViewController(zobacz dokumentację tutaj ). Zasadniczo zyskujesz wszystkie korzyści płynące z wysłania użytkownika do Safari bez zmuszania go do opuszczania aplikacji. Aby użyć nowego SFSafariViewController, wystarczy:

import SafariServices

i gdzieś w module obsługi zdarzeń przedstawia użytkownikowi kontroler widoku safari w następujący sposób:

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

Widok safari będzie wyglądał mniej więcej tak:

wprowadź opis obrazu tutaj


3
To jest niesamowite. Dzięki! Każdy, kto chce wyświetlić przeglądarkę Safari w rozszerzeniu aplikacji, powinien użyć tego kodu. Dostęp do usługi sharedApplicationw rozszerzeniu aplikacji jest zabroniony. Więcej informacji: developer.apple.com/library/archive/documentation/General/…
Baran Emre

1
znakomite rozwiązanie
Mutawe

1
Apple czasami odrzuca aplikacje ze sklepu za używanie starej metody openURL. To powinno być teraz preferowanym rozwiązaniem.
odłączony

19

AKTUALIZACJA dla Swift 4: (dzięki Marco Weberowi)

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

LUB wybierz szybszy styl, używając guard:

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

UIApplication.shared.openURL(requestUrl as URL) 

Swift 3:

Możesz sprawdzić NSURL jako opcjonalny niejawnie przez:

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

4
Amit, nie, ponieważ jest to zrobione wyraźnie, jak wyjaśniłem, jest gwarancją, że requestUrl istnieje, jeśli let requestUrl = ...
CodeOverRide

2
tak, istnieje wiele sposobów robienia rzeczy. Dowiedz się, dlaczego powinieneś używać określonego kodu w danej sytuacji, zamiast być upartym bachorem mówiącym: „Mam rację, a więc twoja zła” mentalność. Wygląda na to, że jesteś nowy w programowaniu, to moja rada dla twojego dzieciaka.
CodeOverRide

3
Amit: Nie, to nie działa, po prostu się mylisz. W Swift 2 lub 1.2. Nic dziwnego, że requestUrl nie jest opcjonalny, więc nie można go rozpakować za pomocą!.
Gusutafu

2
Ta metoda podoba mi się bardziej niż ta od Mike'a S, ponieważ przed wysłaniem żądania sprawdzasz zero.
Nikolaj Nielsen

1
zaktualizowane dla Swift4:if let requestUrl = NSURL(string: "http://www.iSecurityPlus.com") { UIApplication.shared.openURL(requestUrl as URL) }
Marco Weber

12

Swift 3 i IOS 10.2

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

Swift 3 i IOS 10.2


Pamiętaj jednak, że korzystanie z tej wersji spowoduje zatrzymanie działania aplikacji na iOS 9 i wcześniejszych, chyba że sprawdzisz wersję
CupawnTae

11

od iOS 10 powinieneś używać:

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

W Swift 1.2:

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

1

W 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)
    }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.