Verifique que una dirección de correo electrónico sea válida en iOS

Posible duplicado:
¿Mejores prácticas para validar la dirección de correo electrónico en Objective-C en iOS 2.0?

Estoy desarrollando una aplicación para iPhone en la que necesito que el usuario brinde su dirección de correo electrónico al iniciar sesión.

¿Cuál es la mejor manera de verificar si una dirección de correo electrónico es válida?

Buena función de cocoa:

-(BOOL) NSStringIsValidEmail:(NSString *)checkString { BOOL stricterFilter = NO; // Discussion http://blog.logichigh.com/2010/09/02/validating-an-e-mail-address/ NSString *stricterFilterString = @"^[A-Z0-9a-z\\._%+-]+@([A-Za-z0-9-]+\\.)+[A-Za-z]{2,4}$"; NSString *laxString = @"^.+@([A-Za-z0-9-]+\\.)+[A-Za-z]{2}[A-Za-z]*$"; NSString *emailRegex = stricterFilter ? stricterFilterString : laxString; NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex]; return [emailTest evaluateWithObject:checkString]; } 

Discusión sobre Lax vs. Estricto – http://blog.logichigh.com/2010/09/02/validating-an-e-mail-address/

Y debido a que las categorías son simplemente mejores, también puede agregar una interfaz:

 @interface NSString (emailValidation) - (BOOL)isValidEmail; @end 

Implementar

 @implementation NSString (emailValidation) -(BOOL)isValidEmail { BOOL stricterFilter = NO; // Discussion http://blog.logichigh.com/2010/09/02/validating-an-e-mail-address/ NSString *stricterFilterString = @"^[A-Z0-9a-z\\._%+-]+@([A-Za-z0-9-]+\\.)+[A-Za-z]{2,4}$"; NSString *laxString = @"^.+@([A-Za-z0-9-]+\\.)+[A-Za-z]{2}[A-Za-z]*$"; NSString *emailRegex = stricterFilter ? stricterFilterString : laxString; NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex]; return [emailTest evaluateWithObject:self]; } @end 

Y luego utilizar:

 if([@"emailString@email.com" isValidEmail]) { /* True */ } if([@"InvalidEmail@notreallyemailbecausenosuffix" isValidEmail]) { /* False */ } 

Para comprobar si una variable de cadena contiene una dirección de correo electrónico válida, la forma más fácil es probarla con una expresión regular. Hay una buena discusión de varios regex y sus intercambios en regular-expressions.info .

Aquí hay uno relativamente simple que se inclina a permitir algunas direcciones inválidas a través de: ^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[AZ]{2,6}$

Cómo puede usar expresiones regulares depende de la versión de iOS que esté usando.

iOS 4.xy posterior

Puede usar NSRegularExpression , que le permite comstackr y probar directamente contra una expresión regular.

iOS 3.x

No incluye la clase NSRegularExpression , pero incluye NSPredicate , que puede coincidir con expresiones regulares.

 NSString *emailRegex = ...; NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex]; BOOL isValid = [emailTest evaluateWithObject:checkString]; 

Lea un artículo completo sobre este enfoque en cocoawithlove.com .

iOS 2.x

No incluye ninguna coincidencia de expresión regular en las bibliotecas de Cocoa. Sin embargo, puede incluir fácilmente RegexKit Lite en su proyecto, lo que le da acceso a las API regex de nivel C incluidas en iOS 2.0.

Heres uno bueno con NSRegularExpression que funciona para mí.

[text rangeOfString:@"^.+@.+\\..{2,}$" options:NSRegularExpressionSearch].location != NSNotFound;

Puede insertar cualquier expresión regular que desee, pero me gusta poder hacerlo en una línea.

para validar la cadena de correo electrónico, necesitará escribir una expresión regular para verificar que esté en la forma correcta. hay mucho en la web, pero tenga cuidado ya que algunos pueden excluir lo que en realidad son direcciones legales.

esencialmente se verá algo como esto

 ^((?>[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+\x20*|"((?=[\x01-\x7f])[^"\\]|\\[\x01-\x7f])*"\x20*)*(?< ))?((?!\.)(?>\.?[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+)+|"((?=[\x01-\x7f])[^"\\]|\\[\x01-\x7f])*")@(((?!-)[a-zA-Z\d\-]+(?< !-)\.)+[a-zA-Z]{2,}|\[(((?(?)$ 

En realidad, verificar si el correo electrónico existe y no rebota significaría enviar un correo electrónico y ver cuál fue el resultado. es decir, rebotó o no. Sin embargo, es posible que no rebote durante varias horas o que no se repita y que no sea una dirección de correo electrónico “real”. Hay una serie de servicios que pretenden hacer esto por usted y probablemente serán pagados por usted y, francamente, ¿por qué molestarse en ver si es real?

Es bueno comprobar que el usuario no haya olvidado su correo electrónico, de lo contrario podrían ingresarlo incorrectamente, no darse cuenta y luego ser pirateado con usted por no responder. Sin embargo, si alguien quiere agregar una dirección de correo electrónico no va a haber nada para evitar que lo creen en hotmail o yahoo (o en muchos otros lugares) para obtener el mismo fin.

Así que haga la expresión regular y valide la estructura, pero olvídese de validar contra un servicio.