iOS iPhone: Inviare email In-App

      Nessun commento su iOS iPhone: Inviare email In-App

In questo tutorial tratteremo l’SDK iOS per mostrarti come consentire all’utente l’invio di email senza lasciare l’applicazione usando la classe MFMailComposeViewController. Metteremo assieme un modello con destinatari, oggetto, corpo della email e persino una immagine allegata.

iOS SDK fornisce un’interfaccia facile da usare, standard, per consentire agli utenti di inviare e modificare e-mail dall’interno la propria applicazione. Per farlo, sarà necessario utilizzare la classe MFMailComposeViewController.

Questo view controller visualizza un’interfaccia di posta standard e fornisce anche la funzionalità per rispondere “agli eventi utente” eseguiti su tale interfaccia. Per esempio, la classe ti avviserà se l’utente preme “Invia” o “Annulla”.

Nota: MFMailComposeViewController disponibile solo su iOS 3.0 o versioni successive.
Quindi, come funziona? Segui i passaggi in questo tutorial per scoprire.

Creiamo un nuovo progetto di Xcode

Aprire Xcode e selezionare “Create a new Xcode project”. Selezionare View-based Application e poi clicca Next. Inserire un nome per il progetto. Io l’ho chiamato “Mail”. Inserire il vostro company id e assicurarsi di aver selezionato “iPhone” come famiglia di dispositivi, poiché stiamo per fare un app iPhone, possiamo scegliere anche iPad o universale se vogliamo supportare entrambi i dispositivi.

Schermata 2013-06-12 alle 12.26.39

Aggiungiamo l’interfaccia

Aprire il file “MailViewController.xib” e trascinare un pulsante nella view. Impostare il titolo del pulsante “Mail”. Ora selezionare il tasto centrale dell’Editor per visualizzare “Assistant Editor”, così possiamo aggiungere un’azione al pulsante che abbiamo appena creato.

MFMailComposeViewController_AssistantEditor

Seleziona il pulsante e clicca su CTRL mentre trascini verso “MailViewController.h” nel popup che verrà mostrato inserisci “openMail” come Name e assicurati che la Connection si Action, poiché vogliamo creare un azione e non un outlet.

MFMailComposeViewController_connectButton

MessageUI framework

Nell’area di navigatore di Xcode 4, selezionare il nome del progetto. Poi, selezionare il target (“Mail” in questo caso) e quindi selezionare la scheda “Build Phases”. Espandi l’opzione  “Link Binary With Libraries” e quindi fare clic sul pulsante “+”. Scrivi “message” nella casella di ricerca e selezionare l’opzione MessageUI.framework che appare nell’elenco. Fare clic su “Add” per includere questo framework in fase di linking del vostro progetto.

Ora che hai aggiunto il framework MessageUI nel progetto, è necessario importarlo nel view controller che utilizzerà il MFMailComposeViewController, quindi, nel nostro caso, MailViewController.h.

Recati in questo file e modifica il codice come segue:

[code lang=”obj-c”]
#import <UIKit/UIKit.h>

#import <MessageUI/MessageUI.h>

@interface MailViewController : UIViewController <MFMailComposeViewControllerDelegate>

– (IBAction)openMail:(id)sender;

@end
[/code]

Come puoi vedere, abbiamo anche dichiarato il MFMaileComposeViewControllerDelegate nel codice di cui sopra. Useremo questo delegato per vedere il risultato della posta.

Aggiungiamo le risorse

Trascinare l’immagine riportata di seguito nella cartella nel vostro progetto (probabile che dobbiate prima salvarla sul Mac e poi importarla su Xcode). Assicurarsi che  “Copy items into destination group’s folder (if needed)” sia selezionate prima di fare clic su finish.

iprog_logo_piccolo

Aprire il file “MailViewController.m” e scorrere fino ad openMail: e modificare il codice come segue:

[code lang=”obj-c”]

– (IBAction)openMail:(id)sender

{

if ([MFMailComposeViewController canSendMail])

{

}

else

{

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Fallito"

message:@"Il tuo dispositivo con supporta l’invio in-App"

delegate:nil

cancelButtonTitle:@"OK"

otherButtonTitles:nil];

[alert show];

[alert release];

}

}

[/code]

Qui controlliamo se il dispositivo corrente è in grado di inviare e-mail con il metodo canSendMail della classe MFMailComposeViewController. È sempre necessario chiamare questo metodo, prima di aprire l’interfaccia di posta. Se il dispositivo non è in grado di inviare posta elettronica, si dovrebbe informare l’utente (qui ho usato un UIAlertView per farlo).

Mostrare l’interfaccia principale

Se il dispositivo è in grado di inviare e-mail, è l’ora di visualizzare l’interfaccia di posta. Vai al metodo openMail: e modifichiamo il codice nell’istruzione if come segue:

[code lang=”obj-c”]

{

MFMailComposeViewController *mailer = [[MFMailComposeViewController alloc] init];

mailer.mailComposeDelegate = self;

[mailer setSubject:@"Un messaggio da iProg.it"];

NSArray *toRecipients = [NSArray arrayWithObjects:@"primaMail@example.com", @"secondaMail@example.com", nil];

[mailer setToRecipients:toRecipients];

UIImage *myImage = [UIImage imageNamed:@"iprog_logo_piccolo.png"];

NSData *imageData = UIImagePNGRepresentation(myImage);

[mailer addAttachmentData:imageData mimeType:@"image/png" fileName:@"iprog_logo"];
NSString *emailBody = @"Hai visitato iProg.it ? Tanti tutorial disponibili";

[mailer setMessageBody:emailBody isHTML:NO];

[self presentModalViewController:mailer animated:YES];

[mailer release];

}

[/code]

Prima si crea un oggetto MFMaileComposeViewController e l’abbiamo chiamato “mailer”. Abbiamo impostato il mailComposeDelegate a self, così possiamo vedere il risultato della posta. L’oggetto è impostato a “Un messaggio da iProg.it”. Come potete vedere, il toRecipients è di tipo NSArray. Questo perché è possibile aggiungere più destinatari. Ho aggiunto due indirizzi email fittizi, ma naturalmente è possibile inserire qualsiasi indirizzo che desideri. Dopo di che, salviamo un’immagine come oggetto NSData, perché noi non possiamo inviare un UIImage direttamente. Poi aggiungiamo l’oggetto NSData come allegato al nostro indirizzo e-mail. Abbiamo impostato il tipo di un’immagine png e il nome del file da “iprog_logo”. Questo significa che quando il ricevitore salva l’immagine, verrà salvato sotto il nome “iprog_logo”. L’ultima cosa che facciamo è mostrare il mailer prima di rilasciare l’oggetto mailer.

Controlliamo cosa succede

È necessario chiudere manualmente l’interfaccia posta in risposta a una chiamata al metodo delegato. Aggiungere il codice riportato sotto il metodo openMail:

[code lang=”obj-c”]

– (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error

{

switch (result)

{

case MFMailComposeResultCancelled:

NSLog(@"Mail cancellata: hai annullato l’operazione e nessun messaggio di posta elettronica è stato accodato.");

break;

case MFMailComposeResultSaved:

NSLog(@"Mail salvata: è stato salvato il messaggio di posta elettronica nella cartella bozze.");

break;

case MFMailComposeResultSent:

NSLog(@"Inviato per e-mail: il messaggio di posta elettronica viene accodato in posta in uscita. È pronta da inviare.");

break;

case MFMailComposeResultFailed:

NSLog(@"Invio non riuscito: il messaggio e-mail non è stato salvato o in coda, forse a causa di un errore.");

break;

default:

NSLog(@"Email non inviata.");

break;

}

[self dismissModalViewControllerAnimated:YES];

}

[/code]

In questo metodo di delegato, possiamo controllare il risultato del’invio con un’istruzione switch e poi chiudere il view controller con un’animazione. Nel codice di cui sopra, ho semplicemente stampato un messaggio NSLog con i risultati, ma il punto è che l’app potrebbe rispondere in modo dinamico per l’azione dell’utente.

BONUS: Facciamola funzionare su iPad

Su un iPad sarebbe bello mostrare l’interfaccia Mail in una pagina appositamente disegnata. È possibile farlo aggiungendo la seguente riga di codice appena sopra [self presentModalViewController:mailer animata: YES]

[code lang=”obj-c”]mailer.modalPresentationStyle = UIModalPresentationPageSheet;[/code]

Abbiamo concluso. Per feedback o richieste lasciami un commento!