Swift Open Link in Safari


150

Attualmente sto aprendo il link nella mia app in a WebView, ma sto cercando un'opzione per aprire il link in Safari .

Risposte:


348

Non è "cotto in Swift", ma è possibile utilizzare UIKitmetodi standard per farlo. Dai un'occhiata a UIApplication (deprecato) e .openUrl(_:) open(_:options:completionHandler:)

Swift 4 + Swift 5 (iOS 10 e versioni successive)

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

Swift 3 (iOS 9 e precedenti)

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)    

C'è qualche possibilità dall'app store se aggiungiamo un URL di acquisto come questo?
Jan

8
In iOS 10.0 ora è necessario aggiungere opzioni e gestore: UIApplication.shared.open (URL (stringa: " google.com" ) !, opzioni: [:], completamentoHandler: zero)
gabicuesta

1
@gabicuesta In realtà non devi fornire opzioni e completamentoHandler, per impostazione predefinita sono [:] e zero, rispettivamente
Jeremy

79

Novità con iOS 9 e versioni successive è possibile presentare all'utente un SFSafariViewController(vedere la documentazione qui ). Fondamentalmente ottieni tutti i vantaggi di inviare l'utente a Safari senza che lasci la tua app. Per utilizzare il nuovo SFSafariViewController solo:

import SafariServices

e da qualche parte in un gestore di eventi presenta all'utente il controller di visualizzazione Safari in questo modo:

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

La vista del safari sarà simile a questa:

inserisci qui la descrizione dell'immagine


3
Questo e spettacolare. Grazie! Tutti coloro che vogliono mostrare il browser Safari in un'estensione per app dovrebbero usare questo codice. sharedApplicationÈ vietato accedere alla proprietà nell'estensione dell'app. Per ulteriori informazioni: developer.apple.com/library/archive/documentation/General/…
Baran Emre,

1
soluzione eccezionale
Mutawe,

1
A volte Apple rifiuta le app dallo store per l'utilizzo del vecchio metodo openURL. Questa dovrebbe ora essere la soluzione preferita.
sezionatore

19

AGGIORNATO per Swift 4: (credito a Marco Weber)

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

O vai con più di stile rapido usando guard:

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

UIApplication.shared.openURL(requestUrl as URL) 

Swift 3:

È possibile controllare NSURL come facoltativo implicitamente:

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

4
Amit, No, perché è fatto esplicitamente come ho spiegato, è garanzia che requestUrl esista se let requestUrl = ...
CodeOverRide

2
sì, ci sono molti modi per fare le cose. Scopri il motivo per cui dovresti usare un certo codice in una situazione invece di essere un monello testardo che dice: "Ho ragione, quindi la tua mentalità sbagliata". Sembra che tu sia nuovo nella programmazione, questo è il mio consiglio per te, ragazzo.
CodeOverRide,

3
Amit: No, non funziona, ti sbagli semplicemente. In Swift 2 o 1.2. E non c'è da stupirsi, requestUrl non è un optional quindi non puoi scartarlo!
Gusutafu,

2
Mi piace questo metodo meglio di quello di Mike S, perché fai il controllo zero prima di inviare la richiesta.
Nikolaj Nielsen,

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

12

Swift 3 e IOS 10.2

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

Swift 3 e IOS 10.2


Ma nota che l'utilizzo di questa versione si fermerà la vostra applicazione in esecuzione su iOS 9 e versione precedente se non si controlla che
CupawnTae

11

da iOS 10 dovresti usare:

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)
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.