2015-09-30 96 views
7

我的代碼:SFSafariViewController崩潰:指定的URL具有不受支持的方案。

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

這崩潰的初始化只有例外:

指定的URL有不支持的方案。只支持HTTP和HTTPS URL

當我使用url = NSURL(string: "http://www.google.com")時,一切都很好。 我實際上是從API加載URL的,因此我不能確定它們的前綴是http(s)://

如何解決這個問題?我應該始終檢查並加上前綴http://,或者有解決方法嗎?

+0

看到這個鏈接,可以幫助您http://stackoverflow.com/questions/32577727/uiwebview-does-not-show-images-on-ios-9-and-safariviewcontroller-does-not-load –

+0

我檢查了一下,它沒有關係。我已經允許任意加載。這個問題是不允許連接和SFSafariController加載本地html。 –

+1

這種類型讓你希望有一個'SFSafariViewController.canOpen(url:)' - 檢查支持的url的方式。 – Jonny

回答

3

在創建NSUrl對象之前,您可以在您的url字符串中檢查http的可用性。

認沽下面的代碼代碼之前,它會解決你的問題(你可以在同樣的方式檢查https也)

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

是的,這是我在問題中提到的解決方案。我想知道是否有一些解決方法或更好的方法來解決這個問題? –

+0

@SahilKapoor截至目前我找不到任何更好的解決方案,如果你能找到它,那麼也提到它以備將來參考 – Yuvrajsinh

19

嘗試製作的SFSafariViewController實例前檢查URL方案。

斯威夫特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) 
    } 
} 

斯威夫特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

我做Yuvrajsinh的& 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) 
} 
相關問題