web-dev-qa-db-ja.com

SFSafariViewControllerのクラッシュ:指定されたURLにサポートされていないスキームがあります

私のコード:

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

これは、例外を除いて初期化時にのみクラッシュします。

指定されたURLにはサポートされていないスキームがあります。 HTTPおよびHTTPSURLのみがサポートされています

url = NSURL(string: "http://www.google.com")を使用すると、すべて問題ありません。私は実際にAPIからURLをロードしているので、それらの前にhttp(s)://が付いているかどうかはわかりません。

この問題に取り組む方法は?常に_http://_をチェックしてプレフィックスを付ける必要がありますか、それとも回避策がありますか?

14
Sahil Kapoor

urlオブジェクトを作成する前に、NSUrl文字列でhttpが使用可能かどうかを確認できます。

次のコードをコードの前に置くと、問題が解決します(httpsも同じ方法で確認できます)

var strUrl : String = "www.google.com"
if strUrl.lowercaseString.hasPrefix("http://")==false{
     strUrl = "http://".stringByAppendingString(strUrl)
}
9
Yuvrajsinh

URLのインスタンスを作成する前に、SFSafariViewControllerのスキームを確認してみてください。

Swift

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

ユブラジシンとホセオクチョイの答えを組み合わせてやりました。

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

WKWebViewの方法(iOS 11以降)を使用し、

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