检查URL是否在Swift 4中有效

时间:2017-11-24 00:19:09

标签: ios swift sfsafariviewcontroller

如何查看网址在Swift 4中是否有效?我正在构建一个简单的Web浏览器供个人使用,即使我知道每次我都要输入完整的URL而不是应用程序崩溃,如果我忘记了。

import UIKit
import SafariServices

class MainViewController: UIViewController {
    @IBOutlet weak var urlTextField: UITextField!

    @IBAction func startBrowser(_ sender: Any) {
        if let url = self.urlTextField.text {
            let sfViewController = SFSafariViewController(url: NSURL(string: url)! as URL)
            self.present(sfViewController, animated: true, completion: nil)
        }
        print ("Now browsing in SFSafariViewController")
    }
}

例如,如果我要输入不带http://或https://的网址,则应用会因错误'NSInvalidArgumentException', reason: 'The specified URL has an unsupported scheme. Only HTTP and HTTPS URLs are supported.'

而崩溃

2 个答案:

答案 0 :(得分:1)

您可能正在崩溃,因为您正在使用!运算符,而不是检查它是否有效。而是尝试:

@IBAction func startBrowser(_ sender: Any) {
    if let urlString = self.urlTextField.text {
        let url: URL?
        if urlString.hasPrefix("http://") {
            url = URL(string: urlString)
        } else {
            url = URL(string: "http://" + urlString)
        }
        if let url = url {
            let sfViewController = SFSafariViewController(url: url)
            self.present(sfViewController, animated: true, completion: nil)
            print ("Now browsing in SFSafariViewController")
        }
    }
}

这应该让你知道如何处理不同的情况,但你可能想要更复杂的东西来处理https和剥离空白。

答案 1 :(得分:0)

通过阅读接受的答案的注释,我可以看到您实际上是想验证该URL,然后再尝试使用Safari打开它以防止崩溃,以检查该URL是否有效。

您可以使用正则表达式来验证字符串(我创建了扩展名,因此可以在任何字符串上检查其是否为有效的URL):

extension String {
func validateUrl () -> Bool {
        let urlRegEx = "((?:http|https)://)?(?:www\\.)?[\\w\\d\\-_]+\\.\\w{2,3}(\\.\\w{2})?(/(?<=/)(?:[\\w\\d\\-./_]+)?)?"
        return NSPredicate(format: "SELF MATCHES %@", urlRegEx).evaluate(with: self)
    }
}