Ios 检查URL在Swift 4中是否有效
如何检查Swift 4中的URL是否有效?我正在为个人使用构建一个简单的web浏览器,尽管我知道每次输入完整的URL,但如果我忘记了,我宁愿得到一个警报,而不是应用程序崩溃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
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})(/)?