t012_IS02 Nel tutorial “T#004 – Inviare una e-mail” avevamo visto come inviare una mail da iPhone, passando destinatari, oggetto e corpo del messaggio dalla nostra applicazione a quella nativa, Mail, di iPhone. Ovviamente questo metodo è un po’ scomodo, in quanto porta alla chiusura del nostro programma in esecuzione per poter aprire Mail ed inviare così il messaggio di posta. Sta di fatto che questa è comunque l’unica soluzione per chi ha ancora un iPhone con firmware precedente alla versione 3.0. E’ infatti da questa versione del firmware che è stata aggiunta la possibilità di implementare l’invio diretto delle e-mail dalle nostre Applicazioni. Grazie al framework “MessageUI.framework” e poche righe di codice potremo quindi inviare e-mail direttamente dalle nostre applicazioni senza uscire dal programma.

Partiamo quindi con il nostro tutorial:

  • Apriamo Xcode e creiamo un nuovo progetto
  • Dall’elenco dei template disponibili scegliamo “View-based Application” e proseguiamo
  • Date un nome all’applicazione, ad esempio “inAppMail”
  • Scegliete dove salvare il programma e proseguite

Prima di iniziare a scrivere codice dovremo inserire il framework “MessageUI.framework”. Per farlo seguite questi semplici passi:

  • Cliccate con il pulsante destro del mouse su “Frameworks” in “Groups & Files”
  • Cliccate su “Add”, quindi su “Existing Frameworks…”
  • Dalla nuova finestra cercate e selezionate “MessageUI.framework” e cliccate infine su “Add”

Apriamo ora il file “inAppMailViewController.h” e inseriamo il seguente codice:

#import <UIKit/UIKit.h>
#import <MessageUI/MessageUI.h>
 
@interface inAppMailViewController : UIViewController <MFMailComposeViewControllerDelegate, UINavigationControllerDelegate> {
 
}
 
-(IBAction)inviaMail;
 
@end

Non abbiamo fatto altro che importare “MessageUI/MessageUI.h” per poter utilizzare ciò che ci offre il nuovo framework, abbiamo aggiunto i protocolli “MFMailComposeViewControllerDelegate” e “UINavigationControllerDelegate” e abbiamo dichiarato infine un metodo di tipo IBAction, che collegheremo ad un oggetto UIButton creato più avanti con Interface Builder, di nome “inviaMail”.

Apriamo ora il file “inAppMailViewController.m” e inseriamo il seguente codice:

-(IBAction)inviaMail{
	MFMailComposeViewController *mail = [[MFMailComposeViewController alloc] init];
	mail.mailComposeDelegate = self;
 
	if([MFMailComposeViewController canSendMail]){
		[mail setToRecipients:[NSArray arrayWithObjects:@"info@devapp.it", nil]];
		[mail setSubject:@"Oggetto della mail"];
		[mail setMessageBody:@"Corpo del messaggio della nostra e-mail" isHTML:NO];
		[self presentModalViewController:mail animated:YES];
	}
 
	[mail release];
}
 
- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error{
 
	[self dismissModalViewControllerAnimated:YES];
 
	if (result == MFMailComposeResultFailed){
		UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Messaggio non inviato!" message:@"Non è stato possibile inviare la tua e-mail" delegate:self cancelButtonTitle:@"Annulla" otherButtonTitles:nil];
		[alert show];
		[alert release];
	}
}

Con il primo metodo, “inviaMail”, creiamo un oggetto di tipo “MFMailComposeViewController” di nome “mail”, settiamo il suo delegato a self e verifichiamo se la mail può essere inviata. In caso affermativo settiamo destinatari, oggetto e corpo del messaggio via codice (anche se potremmo tranquillamente creare un’interfaccia grafica e lasciare all’utente il compito di compilare questi campi) e apriamo tramite una semplice animazione la ModalViewController che conterrà il nostro messaggio pronto per l’invio.

Il secondo metodo serve semplicemente a farci tornare alla nostra applicazione una volta inviato il messaggio e in caso di errore durante l’invio, a restituirci un messaggio di alert che ci indica quanto appena accaduto. Per quanto riguarda il codice è tutto.

Apriamo ora Interface Builder facendo doppio click sul file “inAppMailViewController.xib”. Trasciniamo quindi nella view un oggetto UIButton, modifichiamo la sua proprietà “Title” in “INVIA E-MAIL” e clicchiamo su “File’s Owner”. Colleghiamo quindi il metodo “inviaMail” con il pulsante appena creato facendo attenzione a scegliere “Touch up inside” dall’elenco che ci appare rilasciando il mouse sull’UIButton. Il risultato, “abbellimenti estetici” a parte, è una semplice vista con un pulsante al suo interno:


t012_IB

Salviamo e chiudiamo Interface Builder. Da Xcode clicchiamo su “Build and Run” e testiamo la nostra applicazione. L’invio vero e proprio della mail sarà possibile solo se l’applicazione viene testata da un dispositivo, tramite iPhone Simulator dovremo accontentarci di vedere la mail pronta per l’invio al click del pulsante. Di seguito due immagine dell’applicazione durante l’esecuzione:


t012_IS01


t012_IS02

Se voleste inserire un allegato, ad esempio un’immagine contenuta nel vostro progetto, dovrete inserire prima dell’istruzione [self presentModalViewController:mail animated:YES]; il seguente codice:

UIImage *img = [UIImage imageNamed:@"background.png"];
NSData *myData = UIImageJPEGRepresentation(img ,1.0);
[mail addAttachmentData:myData mimeType:@"image/png" fileName:@"image.jpeg"];

Dove in imageNamed dovete mettere il nome della vostra immagine, nel nostro esempio background.png e in fileName il nome che avrà il file allegato alla mail (dovrebbe essere lo stesso, ma volendo si può cambiare).