Solución:
Si su objetivo es verificar si su aplicación puede abrir una URL, esto es lo que puede hacer. Aunque safari puede abrir la URL, es posible que el sitio web no exista o que esté inactivo.
`// Swift 5
func verifyUrl (urlString: String?) -> Bool {
if let urlString = urlString {
if let url = NSURL(string: urlString) {
return UIApplication.shared.canOpenURL(url as URL)
}
}
return false
}
`
Como nota al margen, esto hace no compruebe si una URL es válida o está completa. Por ejemplo, una llamada que pasa “https: //” devuelve verdadero.
Rápido 4 elegante solución usando NSDataDetector
:
extension String {
var isValidURL: Bool {
let detector = try! NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue)
if let match = detector.firstMatch(in: self, options: [], range: NSRange(location: 0, length: self.utf16.count)) {
// it is a link, if the match covers the whole string
return match.range.length == self.utf16.count
} else {
return false
}
}
}
Uso:
let string = "https://www.fs.blog/2017/02/naval-ravikant-reading-decision-making/"
if string.isValidURL {
// TODO
}
Razonamiento detrás del uso NSDataDetector
en lugar de UIApplication.shared.canOpenURL
:
Necesitaba un método que detectara si el usuario proporcionó una entrada que es una URL a algo. En muchos casos, los usuarios no incluyen el http://
ni https://
Esquema de URL en la URL que escriben, por ejemplo, en lugar de "http://www.google.com"
ellos escribirían "www.google.com"
. Sin el esquema de URL, el UIApplication.shared.canOpenURL
no reconocerá la URL y volverá false
. NSDataDetector
es, comparado con UIApplication.shared.canOpenURL
, una herramienta bastante indulgente (como @AmitaiB mencionó en los comentarios), y puede detectar incluso URL sin la http://
esquema. De esta manera, puedo detectar una URL sin tener que intentar agregar el esquema cada vez que pruebo la cadena.
Nota al margen – SFSafariViewController
solo puede abrir URL con http://
/https://
. Por lo tanto, si una URL detectada no tiene un esquema de URL especificado y desea abrir el enlace, deberá anteponer el esquema manualmente.
Para obtener una versión rápida 3 de la respuesta aceptada:
func verifyUrl(urlString: String?) -> Bool {
if let urlString = urlString {
if let url = URL(string: urlString) {
return UIApplication.shared.canOpenURL(url)
}
}
return false
}
O para una solución más Swifty:
func verifyUrl(urlString: String?) -> Bool {
guard let urlString = urlString,
let url = URL(string: urlString) else {
return false
}
return UIApplication.shared.canOpenURL(url)
}