2015-09-30 3 views
7

Il mio codice:Arresto anomalo di SFSafariViewController: l'URL specificato ha uno schema non supportato.

if let url = NSURL(string: "www.google.com") { 
    let safariViewController = SFSafariViewController(URL: url) 
    safariViewController.view.tintColor = UIColor.wantoPrimaryOrangeColor() 
    presentViewController(safariViewController, animated: true, completion: nil) 
} 

Questo si blocca su di inizializzazione solo con eccezione:

L'URL specificato ha uno schema non supportato. Sono supportati solo gli URL HTTP e HTTPS

Quando utilizzo url = NSURL(string: "http://www.google.com"), tutto va bene. In realtà sto caricando gli URL da API e, quindi, non posso essere sicuro che saranno preceduti da http(s)://.

Come affrontare questo problema? Devo controllare e prefisso sempre http:// o c'è una soluzione?

+0

vedono questo link può essere aiutare http://stackoverflow.com/questions/32577727/uiwebview-does-not-show-images-on-ios-9-and-safariviewcontroller-does-not-load –

+0

L'ho verificato, non è correlato. Sto già permettendo il caricamento arbitrario. Questo problema non consente la connessione e non il caricamento di html locale da parte di SFSafariController. –

+1

Un po 'come ti piacerebbe che ci fosse un 'SFSafariViewController.canOpen (url:)' -ish modo di controllare gli URL supportati. – Jonny

risposta

3

È possibile verificare la disponibilità di http nella stringa url prima di creare l'oggetto NSUrl.

Put seguente codice prima il codice e si risolverà il vostro problema (è possibile verificare la presenza di https anche in stesso modo)

var strUrl : String = "www.google.com" 
if strUrl.lowercaseString.hasPrefix("http://")==false{ 
    strUrl = "http://".stringByAppendingString(strUrl) 
} 
+1

Sì, questa è una soluzione che ho menzionato nella domanda stessa. Voglio sapere se ci sono alcuni workaround o un modo migliore per affrontare questo? –

+0

@SahilKapoor A partire da ora non riesco a trovare una soluzione migliore per questo, se potessi trovarlo poi menzionarlo anche per riferimento futuro – Yuvrajsinh

19

Prova a controllare schema di URL prima di fare un'istanza di SFSafariViewController.

Swift 3:

func openURL(_ urlString: String) { 
    guard let url = URL(string: urlString) else { 
     // not a valid URL 
     return 
    } 

    if ["http", "https"].contains(url.scheme?.lowercased() ?? "") { 
     // Can open with SFSafariViewController 
     let safariViewController = SFSafariViewController(url: url) 
     self.present(safariViewController, animated: true, completion: nil) 
    } else { 
     // Scheme is not supported or no scheme is given, use openURL 
     UIApplication.shared.open(url, options: [:], completionHandler: nil) 
    } 
} 

Swift 2:

func openURL(urlString: String) { 
    guard let url = NSURL(string: urlString) else { 
     // not a valid URL 
     return 
    } 

    if ["http", "https"].contains(url.scheme.lowercaseString) { 
     // Can open with SFSafariViewController 
     let safariViewController = SFSafariViewController(URL: url) 
     presentViewController(safariViewController, animated: true, completion: nil) 
    } else { 
     // Scheme is not supported or no scheme is given, use openURL 
     UIApplication.sharedApplication().openURL(url) 
    } 
} 
4

ho fatto una combinazione di risposte di Yuvrajsinh & di hoseokchoi.

func openLinkInSafari(withURLString link: String) { 

    guard var url = NSURL(string: link) else { 
     print("INVALID URL") 
     return 
    } 

    /// Test for valid scheme & append "http" if needed 
    if !(["http", "https"].contains(url.scheme.lowercaseString)) { 
     let appendedLink = "http://".stringByAppendingString(link) 

     url = NSURL(string: appendedLink)! 
    } 

    let safariViewController = SFSafariViewController(URL: url) 
    presentViewController(safariViewController, animated: true, completion: nil) 
}