私のコード:
_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://
_をチェックしてプレフィックスを付ける必要がありますか、それとも回避策がありますか?
url
オブジェクトを作成する前に、NSUrl
文字列でhttpが使用可能かどうかを確認できます。
次のコードをコードの前に置くと、問題が解決します(https
も同じ方法で確認できます)
var strUrl : String = "www.google.com"
if strUrl.lowercaseString.hasPrefix("http://")==false{
strUrl = "http://".stringByAppendingString(strUrl)
}
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)
}
}
ユブラジシンとホセオクチョイの答えを組み合わせてやりました。
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)
}
WKWebViewの方法(iOS 11以降)を使用し、
class func handlesURLScheme(_ urlScheme: String) -> Bool