SFSafariViewController crash: The specified URL has an unsupported scheme SFSafariViewController crash: The specified URL has an unsupported scheme ios ios

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