SFSafariViewController crash: The specified URL has an unsupported scheme

谁说我不能喝 提交于 2020-01-12 04:52:11

问题


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?


回答1:


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



回答2:


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



回答3:


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



回答4:


Use WKWebView's method (starting iOS 11),

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


来源:https://stackoverflow.com/questions/32864287/sfsafariviewcontroller-crash-the-specified-url-has-an-unsupported-scheme

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!