Comment vérifier la validité de l'URL dans Swift?
Essayer de mettre une application à lancer le navigateur par défaut pour une URL, mais seulement si l'URL saisie est valide, sinon il affiche un message indiquant que l'URL n'est pas valide.
Comment pourrais-je aller sur la vérification de la validité de l'utilisation de Swift?
- envoyer un NSURLRequest et vérifier le retour?
- Utilisez la chaîne pour former un NSURL et voir s'il est nul?
Vous devez vous connecter pour publier un commentaire.
Si votre objectif est de vérifier si votre application peut ouvrir une url ici est ce que vous pouvez faire. Bien que safari pouvez ouvrir l'Url, le site peuvent ne pas exister, ou il pourrait être à la baisse.
else
s sont redondantes.if let url = NSURL(string: urlString) {
http://hsdfjs
Swift 4 solution élégante à l'aide de
NSDataDetector
:Utilisation:
Raisonnement derrière l'utilisation de
NSDataDetector
au lieu deUIApplication.shared.canOpenURL
:J'ai besoin d'une méthode qui permettrait de détecter si l'utilisateur a fourni une entrée qui est une URL pour quelque chose. Dans de nombreux cas, les utilisateurs ne comprennent pas les
http://
nihttps://
schéma d'URL dans l'URL ils dans - par exemple, au lieu de"http://www.google.com"
ils seraient type dans"www.google.com"
. Sans le schéma d'URL, leUIApplication.shared.canOpenURL
ne pas tenir compte de l'URL et sera de retourfalse
.NSDataDetector
est, par rapport à `, plutôt indulgent outil (comme @AmitaiB mentionné dans les commentaires) - et il peut détecter même Url, sans lehttp://
régime. De cette façon, je suis en mesure de détecter une URL sans avoir à les essayer pour ajouter le système à chaque fois lors de l'essai de la chaîne.Note -
SFSafariViewController
pouvez ouvrir les Url avechttp://
/https://
. Ainsi, si une détection d'URL ne dispose pas d'un schéma d'URL spécifiée, et que vous voulez ouvrir le lien, vous devez faire précéder le schéma manuellement.NSDataDetector
est plutôt indulgent outil de détection. Considérer:adobe.com/go/flex *isValidURL? true *UIApplication.shared.canOpenURL? false gskinner.com/products/spl *iVU? T *canOpen? F https://google.com *iVU? T *canOpen? T https:google.com *iVU? T *canOpen? T www.cool.com.au *iVU? T *canOpen? F http://www.cool.com.au *iVU? T *canOpen? T http://www.cool.com.au/ersdfs *iVU? T *canOpen? T http://www.cool.com.au/ersdfs?dfd=dfgd@s=1 *iVU? T *canOpen? T http://www.cool.com:81/index.html *iVU? T *canOpen? T
NSDataDetector
parce que leUIApplication.shared.canOpenURL
retourne false avec de nombreux des Url valides (qui peut être ouvert dansSafariViewController
). J'avais besoin de marquer les Url dans le texte et ensuite permettre à l'utilisateur de les ouvrir dans safari-vue-contrôleur - c'est pourquoi je me suis retrouvé avec cette solutionPour une swift 3 version de la accepté de répondre:
Ou pour un plus Swifty solution:
if let..
s dans une seule case, et puis aussi inverser leif
à unguard ... else { return false }
pour la rendre plus claire quereturn false
est un état d'échec etreturn UIApplication...
est un (possible) état de succès.À l'aide de 'canOpenUrl' était trop cher pour mon cas d'utilisation, j'ai trouvé que cette approche soit plus rapide
string.characters.count
devientstring.count
J'ai trouvé cette propre (En Swift):
Utilisation:
===
pour Swift 4.1:
Ma préférence personnelle est à l'approche de cette avec une extension, parce que j'aime appeler la méthode directement sur l'objet de type string.
De cette manière, il est également extensible avec un autre cas d'utilisation, comme
isValidEmail
,isValidName
ou quel que soit votre application a besoin.Vous pouvez utiliser le
NSURL
type (dont le constructeur renvoie un type facultatif) combiné avec unsi-laissez -
déclaration pour vérifier la validité d'une URL donnée. En d'autres termes, l'utilisation de laNSURL
failable initialiseur, un élément clé de Swift:Pour Swift 4 version
Cela renvoie un booléen pour une URL de validité, ou nil si une URL facultatif avec une valeur de zéro est passé.
Noter que, si vous prévoyez d'utiliser un Safari vue, vous devez tester
url.scheme == "http" || url.scheme == "https"
.Swift 4.2 Élégante construction d'une URL avec la vérification
Utilisation
Ce n'est pas une regex approche, mais il est un naïf qui fonctionne bien pour s'assurer qu'il y est un hôte et une extension si vous voulez un moyen simple et peu coûteux approche:
À n'utiliser que si vous voulez un moyen rapide de vérifier sur le côté client et vous avez de serveur logique qui va faire un plus rigoureux de vérifier avant l'enregistrement de données.
P. S. Crédits à Shachar pour cette fonction.
Dans certains cas, il peut être suffisant de vérifier que l'url satisfait RFC 1808. Il y a plusieurs façons de le faire. Un exemple:
C'est parce que .l'hôte, ainsi que .chemin, .fragment et quelques autres méthodes de retourner nil si l'url n'est pas conforme à la RFC 1808.
Si vous ne contrôlez pas, vous pourriez avoir ce genre de messages dans la console de log:
Essayez ceci:
Il suffit de vérifications de la validité de l'URL composants et si l'hôte et l'url de composants ne sont pas nulles. Aussi, vous pouvez juste ajouter à une des extensions de fichier
Pour swift 4 vous pouvez utiliser:
C'est pour plus tard Swift 4, basé sur Doug Amos de réponse (par swift 3)