Ios 检查URL在Swift 4中是否有效

Ios 检查URL在Swift 4中是否有效,ios,swift,sfsafariviewcontroller,Ios,Swift,Sfsafariviewcontroller,如何检查Swift 4中的URL是否有效?我正在为个人使用构建一个简单的web浏览器,尽管我知道每次输入完整的URL,但如果我忘记了,我宁愿得到一个警报,而不是应用程序崩溃 import UIKit import SafariServices class MainViewController: UIViewController { @IBOutlet weak var urlTextField: UITextField! @IBAction func startBrowser

如何检查Swift 4中的URL是否有效?我正在为个人使用构建一个简单的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',原因:'指定的URL具有不受支持的方案。仅支持HTTP和HTTPS URL。“

您可能正在崩溃,因为您正在使用
操作员,不检查它是否工作。相反,请尝试:

@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和删除空白。

您可能会崩溃,因为您使用的是
操作员,不检查它是否工作。相反,请尝试:

@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和去除空白。

阅读接受答案上的注释,我可以看出您实际上想要验证URL,在尝试使用Safari打开之前检查它是否有效,以防止任何崩溃

您可以使用正则表达式来验证字符串(我创建了一个扩展,因此对于任何字符串,您都可以检查它是否是有效的URL):

扩展字符串{
func validateUrl()->Bool{

让urlRegEx=“((?:http | https):/)(?:www\\)?[\\w\\d\\-\\-+\\\.\\w{2,3})(\\.\\w{2}”)(/(?阅读对已接受答案的评论,我可以看出您实际上想要验证URL,在尝试使用Safari打开之前检查它是否有效以防止任何崩溃

您可以使用正则表达式来验证字符串(我创建了一个扩展,因此对于任何字符串,您都可以检查它是否是有效的URL):

扩展字符串{
func validateUrl()->Bool{


let urlRegEx=“((?:http | https):/)(?:www\\)?[\\w\\d\-\\-+\\\.\\w{2,3})(\\.\\w{2}”)(/(?如果我没有正确回答我的问题,我很抱歉。每次我没有将http://添加到开头时,应用程序都会崩溃,因此我正在寻找修复方法(可能是if/else语句?)我刚做的更改怎么样?是的,我刚刚修复了它。这就是我没有首先尝试编译的结果。你应该添加崩溃的详细信息。它到底在哪里?我可以通过删除
URL(字符串:URL\u text)来修复它??
如果我没有正确回答问题,我很抱歉。每次我没有在开头添加http://时,应用程序都会崩溃,因此我正在寻找修复方法(可能是if/else语句?)我刚做的更改怎么样?是的,我刚刚修复了它。这就是我没有首先尝试编译的结果。你应该添加崩溃的详细信息。它到底在哪里?我可以通过删除
URL(字符串:URL\u text)来修复它??
从代码中,您应该使用URLComponents来编写url@LeoDabus在我的情况下,这可能吗?为什么不可能?您可以创建一个自定义初始值设定项,其中默认方案是httpa您是否接受带有查询项的更复杂的URL?@LeoDabus我不确定,因为到目前为止我只尝试过简单的URL。您应该使用URLComponents来编写塞你的url@LeoDabus在我的情况下,这可能吗?为什么不可能?您可以创建一个自定义初始值设定项,默认方案是httpa您是否接受带有查询项的更复杂的URL?@LeoDabus我不确定,因为我只尝试了简单的URL。我如何将其实现到我的函数中?func canOpenURL(; string:string?->Bool{guard let urlString=string,let url=url(string:urlString)else{return false}if!UIApplication.shared.canOpenURL(url){return false}let regEx=“(((?:http | https):/)(?:www\\)?[\\w\\d\-]+\\\.\\w{2,3})(/(?)我如何在我的函数中实现它?func canOpenURL(\ustring:string?->Bool{guard let urlString=string,let url=url(string:urlString)else{return false}if!UIApplication.shared.canOpenURL(url){return false}let regEx=“((?:http | https):/)(?:www\\)?[\\w\\d\-]+\.\\w{2,3}(\\\.\\w{2})(/)?