SFSafariViewController crash: The specified URL has an unsupported scheme
Try checking scheme of URL
before making an instance of 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) }}
You can check for availability of http in your url
string before creating NSUrl
object.
Put following code before your code and it will solve your problem (you can check for https
also in same way)
var strUrl : String = "www.google.com"if strUrl.lowercaseString.hasPrefix("http://")==false{ strUrl = "http://".stringByAppendingString(strUrl)}
I did a combination of Yuvrajsinh's & hoseokchoi's answers.
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)}