0Day Forums
SFSafariViewController crash: The specified URL has an unsupported scheme - Printable Version

+- 0Day Forums (https://zeroday.vip)
+-- Forum: Coding (https://zeroday.vip/Forum-Coding)
+--- Forum: Swift (https://zeroday.vip/Forum-Swift)
+--- Thread: SFSafariViewController crash: The specified URL has an unsupported scheme (/Thread-SFSafariViewController-crash-The-specified-URL-has-an-unsupported-scheme)



SFSafariViewController crash: The specified URL has an unsupported scheme - publicly839765 - 07-19-2023

My code:

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

This crashes on initialization only with exception:
> The specified URL has an unsupported scheme. Only HTTP and HTTPS URLs are supported

When I use `url = NSURL(string: "http://www.google.com") `, everything is fine.
I am actually loading URL's from API and hence, I can't be sure that they will be prefixed with `http(s)://`.

How to tackle this problem? Should I check and prefix `http://` always, or there's a workaround?



RE: SFSafariViewController crash: The specified URL has an unsupported scheme - laundryman4353 - 07-19-2023

you can add to



NSString* webStringURL = [url stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
NSURL *URL = [NSURL URLWithString: webStringURL];


RE: SFSafariViewController crash: The specified URL has an unsupported scheme - incavation323377 - 07-19-2023

Use WKWebView's method (starting iOS 11),


class func handlesURLScheme(_ urlScheme: String) -> Bool




RE: SFSafariViewController crash: The specified URL has an unsupported scheme - error684745 - 07-19-2023

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


RE: SFSafariViewController crash: The specified URL has an unsupported scheme - syntagmata377762 - 07-19-2023

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


RE: SFSafariViewController crash: The specified URL has an unsupported scheme - elkae - 07-19-2023

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