2014-09-20 18 views
65

Attualmente sto aprendo il collegamento nella mia app in una WebView, ma sto cercando un'opzione per aprire il collegamento in Safari.Swift Open Link in Safari

C'è un modo semplice per farlo in Swift?

risposta

154

Non è "cotto in Swift", ma è possibile utilizzare i metodi standard UIKit per farlo. Dai uno sguardo allo UIApplication's openUrl().

Swift 4

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

      }) 

Swift 3

UIApplication.shared.openURL(URL(string: "http://www.stackoverflow.com")!) 

Swift 2,2

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

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

+2

'' 'UIApplication.shared.openURL (URL (stringa:" http://www.stackoverflow.com ")!)' '' –

+5

In iOS 10.0 ora è necessario aggiungere opzioni e gestore: UIApplication.shared.open (URL (stringa: "http://www.google.com") !, opzioni: [:], completionHandler: nil) – gabicuesta

15

È possibile controllare NSURL come opti onale implicitamente da:

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

Dovrebbe essere (requestUrl!) –

+3

Amit, No, perché è fatto esplicitamente come ho spiegato è garantito che requestUrl esiste se let RequestUrl = ... – CodeOverRide

+0

In realtà, lo è. In Swift 2. –

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")!) 
18

Nuovo con iOS 9 e versioni successive è possibile presentare l'utente con un SFSafariViewController (vedi documentazione here). Fondamentalmente ottieni tutti i vantaggi di inviare l'utente a Safari senza far uscire la tua app. Per utilizzare il nuovo SFSafariViewController solo:

import SafariServices 

e da qualche parte in un gestore di eventi presentare l'utente con il controller della vista safari in questo modo:

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

La vista safari sarà simile a questo:

enter image description here

11

Swift 3 & IOS 10.2

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

Swift 3 & IOS 10,2

+0

Ricorda però che l'utilizzo di questa versione interromperà l'esecuzione della tua app su iOS 9 e precedenti, a meno che la tua versione non la controlli – CupawnTae

1

dal iOS 10 si dovrebbe 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) 
    } 
0

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

}