Mandando SMS o Correos desde nuestra App

Seguramente en muchas ocasiones se nos habrá presentado la necesidad de mandar información desde nuestra aplicación al «exterior». Para mandar esa información tenemos varias alternativas, sin duda una de las mas sencillas es utilizar los propios mecanismos del móvil para hacerlo. Estos mecanismos son básicamente dos, mandar un correo electrónico o mandar un mensaje corto.

iOS nos proporciona un framework para realizar esta tareas, el nombre es Message UI. Este framework, nos va a proporcionar ViewControllers que podremos invocar desde nuestra aplicación y de esta manera, enviar el mensaje de correo o SMS sin tener que abandonarla.

Junto con los ViewControllers, el framework proporciona dos protocolos que representan los delegados de dichos controladores, de tal manera que podemos recibir información de como ha sido el proceso de envío.

Las clases de los controladores son MFMailComposeViewController y MFMessageComposeViewController.

Antes de empezar a experimentar con las clases, es importante que añadamos el framework a nuestro proyecto, ya que por defecto no lo tendremos. Para ello lo hacemos desde la siguiente ventana de XCode.

Empezando por la del correo electrónico, la clase nos proporciona diversos métodos para prefijar los contenidos, como «setSubject:» «setToRecipients:» o «setMessageBody:isHTML:». Pese a que al ser un viewcontroller cualquiera, podemos usar cualquier técnica para mostrarlo, se recomienda usar el mensaje «presentModalViewController:animated:» de UIViewController.

Es importante notar que una vez que el controlador esta en primer plano, nuestra aplicación no puede cambiar el contenido del correo. Esto es así para prevenir aplicaciones «maliciosas» que podrían mostrar una cosa y luego enviar otra.

De esta manera el código para mostrar la pantalla de envío de correo seria:

MFMailComposeViewController *mailcontroller = [[MFMailComposeViewController alloc] init];
[mailcontroller setSubject:subjectText.text];
[mailcontroller setMessageBody:bodyText.text isHTML:NO];
mailcontroller.mailComposeDelegate = self;
[self presentModalViewController:mailcontroller animated:YES];

Como vemos en el código, previamente tenemos que establecer una instancia como delegado del controlador, cuando el usuario interactue con el controlador, se nos enviara un mensaje del tipo: «mailComposeController:didFinishWithResult:error:». Este paso es importante pues nosotros somos los encargados de ocultar el viewcontroller cuando el usuario haya acabado, y esto lo hacemos llamando a «dismissModalViewControllerAnimated:» en el código del delegado.

- (void)mailComposeController:(MFMailComposeViewController *)controller
          didFinishWithResult:(MFMailComposeResult)result
                        error:(NSError *)error
{
    [controller dismissModalViewControllerAnimated:YES];
}

El caso del controlador de mensajes cortos es muy similar al del correo. La clase es MFMessageComposeViewController, y las propiedades que controlan el contenido son «recipients» y «body», de la misma manera el controlador se muestra con el mensaje «presetModalViewController:animated» y el delegado, en este caso una clase que implemente el protocolo «MFMessageComposeViewControllerDelegate» y el método «messageComposeViewController:didFinishWithResult:» deberá ocultar el controlador una vez que el mensaje haya sido enviado.

MFMessageComposeViewController *smscontroller = [[MFMessageComposeViewController alloc] init];
smscontroller.body = bodyText.text;
smscontroller.messageComposeDelegate = self;
[self presentModalViewController:smscontroller animated:YES];

...

- (void)messageComposeViewController:(MFMessageComposeViewController *)controller
                 didFinishWithResult:(MessageComposeResult)result
{
    [controller dismissModalViewControllerAnimated:YES];
}

Ambos controladores poseen un mensaje estático que nos permite comprobar la disponibilidad de estos métodos. Dichos mensajes son «canSendText» y «canSendMail». Así si estamos en un iPod Touch sin posibilidad de enviar SMS, podemos comprobarlo antes de intentar utilizar esta funcionalidad.

Como veis, el mecanismo para realizar este tipo de tareas es bastante sencillo a la vez que útil.

1 Responses to Mandando SMS o Correos desde nuestra App

  1. Frankeke dice:

    Hola, agradecerte tu tuto.

    Quería preguntarte porque necesito enviar sms desde una aplicación pero tengo problemas para establecer el delegate.

    Estoy creando una extensión en Marmalade para poder mandar SMS.

    Cómo podría hacer lo mismo SIN usar SELF en messageComposeDelegate??

    mil gracias!

Deja un comentario