SFSafariViewController crash: The specified URL has an unsupported scheme

后端 未结 4 1906
渐次进展
渐次进展 2021-02-07 06:23

My code:

if let url = NSURL(string: \"www.google.com\") {
    let safariViewController = SFSafariViewController(URL: url)
    safariViewController.view.tintColor         


        
相关标签:
4条回答
  • 2021-02-07 07:03

    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)
    }
    
    0 讨论(0)
  • 2021-02-07 07:14

    Use WKWebView's method (starting iOS 11),

    class func handlesURLScheme(_ urlScheme: String) -> Bool
    
    0 讨论(0)
  • 2021-02-07 07:22

    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)
        }
    }
    
    0 讨论(0)
  • 2021-02-07 07:26

    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)
    }
    
    0 讨论(0)
提交回复
热议问题