Condivisione! il motivo che dovrebbe spingerti ad implementare un sistema che permetta di inviare email e messaggi con il linguaggio Swift per la tua applicazione iOS.

Sembra una considerazione banale ma, facci caso, la maggior parte delle applicazioni che hanno avuto successo si è diffusa in maniera capillare grazie alla forza di condivisione di questi due strumenti. Su facebook quasi non facciamo caso agli inviti degli amici ad eventi, feste o richieste di download. Ma, quando arriva un messaggio o un email, eccoci là pronti a vedere cosa ci ha mandato il nostro amico più fidato.

Eh si! perché, generalmente, il numero o l’email è un’informazione personale conosciuta solo dagli amici o dai colleghi di lavoro. E chi non vorrebbe seguire, installare o comunque conoscere l’applicazione o il gioco che l’amico o il collega sta utilizzando?

Una delle prime applicazioni ad utilizzare massicciamente la possibilità di inviare email e messaggi è stata sicuramente Whatsapp. Tutti i primi fortunati sono entrati grazie all’invito di un amico o collega.

Forse uno degli strumenti più efficaci a livello di comunicazione e marketing è la condivisione emotiva. Quella che ti spinge, anche inconsapevolmente, a seguire i passi e le scelte dei propri amici.

Quindi, per farla breve, in questo tutorial voglio portati a conoscenza del framework MessageUI. Grazie al framework MessageUI riuscirai ad inviare email e messaggi con il linguaggio Swift dalla tua applicazione iOS.

Sei pronto a diventare uno spammer seriale?

Come progetto base per la tua applicazione, puoi creare un’applicazione simile all’immagine che trovi qui sotto. Il progetto è composto da un ViewController di partenza e due bottoni che portano ad un rispettivo ViewController che nella grafica posseggono gli stessi contenuti. Ovvero una label, una text view ed un bottone. In fondo alla pagina trovi il progetto completo che puoi scaricare nel caso dovessi avere dei problemi.

MessageUI Framework linguaggio swift

Se invece dovessi avere alcuni problemi nella realizzazione dell’interfaccia e non sai da dove cominciare, forse è il caso di partire da qualcosa di più semplice. Per la costruzione delle interfacce se hai aperto il mio progetto, oltre all’auto layout, ho utilizzato le Stack View (introdotte in iOS 9).

Premetto che questo progetto non funziona nel simulatore. Quindi, onde evitare l’autocombustione, devi obbligatoriamente possedere un iPhone con cui poter testare l’applicazione.

Il framework MessageUI

Apple mette a disposizione un Framework per l’invio dei messaggi e delle email. Questo framework prende il nome di MessageUI ed, al suo interno, contiene solamente due classi e due protocolli:

  • MFMailComposeViewController: Ovvero il ViewController per l’interfaccia standard utilizzata per l’invio di una email. La classica pagina che si apre quando crei una nuova email da inviare.
  • MFMessageComposeViewController: Il ViewController con l’interfaccia standard per l’invio di un messaggio.

I restanti due protocolli sono i Delegate, ovvero per l’utilizzo delle sopracitate classi da parte di altri ViewController. Il framework MessageUI non contiene niente di più e niente di meno.

Quindi non ci resta che testare queste due classi.

Inviare una Email con il linguaggio Swift

Per prima cosa spostati nel tuo EmailViewController ed importa il framework MessageUI. Successivamente, devi rendere la classe delegata alla gestione del MFMailComposeViewController, quindi devi implementare il protocollo MFMailComposeViewControllerDelegate. Alla fine, dovresti avere la seguente classe:

import UIKit
import MessageUI

class EmailViewController: UIViewController, MFMailComposeViewControllerDelegate {

    @IBOutlet var field_recipient: UITextField! // la textField per l'acquisizione dell'indirizzo email
    @IBOutlet var textView_message: UITextView! // textView per l'acquisizione del messaggio da inviare
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    // IBAction per l'invio del messaggio email
    @IBAction func sendEmail_clicked(sender: UIButton) {

    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

}

Nel metodo sendEmail_clicked, che nel mio caso è l’IBAction collegata al bottone dell’interfaccia, prima di utilizzare l’oggetto MFMailComposerViewController, devi controllare che il dispositivo può effettivamente inviare le email. 

Il metodo che controlla se il dispositivo può inviare, o no, una email è il canSendMail(). Il metodo restituisce un booleano, true o false, che stabilisce l’esito del controllo. Nel caso in cui dovesse ritornare false, significherebbe che il dispositivo non è predisposto all’invio di una email (ad esempio non ha account configurati) e, di conseguenza, bisogna avvisare l’utilizzatore ed evitare la creazione dell’oggetto MFMailComposerViewController.

All’interno della IBAction sendEmail_clicked, che ti ricordo è il mio metodo collegato al bottone dell’interfaccia, aggiungi il seguente codice:

    @IBAction func sendEmail_clicked(sender: UIButton) {
        if MFMailComposeViewController.canSendMail() {

        } else {
            print("Errore! non posso inviare email")
            // INVIA UN MESSAGGIO ALL'UTENTE (AD ESEMPIO CON UNA ALERT VIEW)
        }
    }

Nel caso dell’else puoi istanziare una AlertView in modo da avvisare l’utilizzatore dell’errore generato.

Adesso, all’interno dell’if true, puoi istanziare l’oggetto MFMailComposerViewController. Una volta istanziato, devi assegnargli chi sarà il suo delegato (cioè chi sarà a gestirlo, nel tuo caso è il ViewController in cui hai inserito il codice).

if MFMailComposeViewController.canSendMail() {
            
            let mail = MFMailComposeViewController()
            mail.mailComposeDelegate = self

Fatto questo passaggio, devi definire chi sarà il destinatario ed il contenuto dell’email. A tale scopo, puoi utilizzare i metodi:

  • setToRecipients([String]): Che accetta in ingresso un array di stringhe nel caso in cui volessi inviare a più persone la tua email.
  • setSubject(String): Definisce l’oggetto dell’email
  • setMessageBody(message: String, isHTML: Bool): Dove il primo parametro è il messaggio da inviare ed il secondo è un booleano che indica se il messaggio contiene dei tag html oppure no.

Dopo aver settato i campi dell’email, puoi presentare il MailComposer con il presentViewController.

    @IBAction func sendEmail_clicked(sender: UIButton) {
        if MFMailComposeViewController.canSendMail() {
            
            let mail = MFMailComposeViewController()
            mail.mailComposeDelegate = self
            
            mail.setToRecipients([self.field_recipient.text!])
            mail.setSubject("Oggetto di prova")
            mail.setMessageBody(self.textView_message.text, isHTML: false)
            
            self.presentViewController(mail, animated: true, completion: nil)
            
        } else {
            print("Errore! non posso inviare email")
            // INVIA UN MESSAGGIO ALL'UTENTE (AD ESEMPIO CON UNA ALERT VIEW)
        }
    }

Se vuoi testare l’applicazione, ti ricordo che devi collegarla al tuo iPhone reale e selezionarlo da Xcode per il test su dispositivo. Se provi ad avviare il progetto sul simulatore, verrà generato un errore che non potrai risolvere.

MFMailCoposeViewController e inviare email con linguaggio swift
La foto è uno screen del dispositivo. Ti ricordo che il progetto funziona solo su dispositivo reale e non sul simulatore.

Infine, dato che il MailCompose non si chiude quando invii l’email o elimini la bozza, devi aggiungere il metodo del delegate didFinishWithResult. Il metodo didFinishWithResult viene invocato quando l’utente preme sul bottone Invia o Annulla. Per capire il motivo della chiusura del controller ti basta inserire uno switch, e successivamente chiamare il dismissViewController per chiudere definitivamente il MailCompose:

func mailComposeController(controller: MFMailComposeViewController, didFinishWithResult result: MFMailComposeResult, error: NSError?) {

        switch result{
        
        case MFMailComposeResultCancelled:
            print ("Invio dell'email cancellato dall'utente")
            break
            
        case MFMailComposeResultSaved:
            print ("Email salvata come bozza")
            break
            
        case MFMailComposeResultSent:
            print ("Email inviata correttamente")
            break
            
        case MFMailComposeResultFailed:
            print ("Email non inviata, probabilmente a causa di un errore")
            break
        
        default:
            //questo caso non dovrebbe mai presentarsi!
            break
        
        }
        
        self.dismissViewControllerAnimated(true, completion: nil)
 
    }

Inviare un messaggio con il linguaggio Swift

I passaggi per l’invio di un messaggio sono praticamente gli stessi. I metodi cambiano semplicemente il nome e rimangono uguali nell’implementazione.

Il primo passaggio è sempre quello del check sulla possibilità di invio di un messaggio. Qui il metodo da richiamare si chiama canSendText() e restituisce false nel caso in cui non è possibile inviare un messaggio.

    // IBAction per l'invio del messaggio ad un utente
    @IBAction func sendMessage_clicked(sender: UIButton) {
        if MFMessageComposeViewController.canSendText() {

        } else {
            print("Errore! non posso inviare un messaggio ")
        }
    }

A differenza di un’email, per un messaggio ti basta definire solamente il destinatario e il testo del messaggio. Una volta creato l’oggetto MFMessageComposeViewController e dopo aver assegnato il delegate, puoi riempire le proprietà:

  • recipients: La proprietà è di tipo Array di String e serve a definire i vari destinatari del messaggio.
  • body: La proprietà è di tipo String e rappresenta il messaggio da inviare.
    // IBAction per l'invio del messaggio ad un utente
    @IBAction func sendMessage_clicked(sender: UIButton) {
        let message = MFMessageComposeViewController()
        message.messageComposeDelegate = self
        
        message.recipients = [self.field_recipient.text!]
        message.body = self.textView_message.text

        self.presentViewController(message, animated: true, completion: nil)
    }

Infine, implementa il metodo didFinishWithResult per gestire gli eventi legati alla pressione del tasto Invia o Annulla della finestra di invio di un messaggio:

    func messageComposeViewController(controller: MFMessageComposeViewController, didFinishWithResult result: MessageComposeResult) {
        controller.dismissViewControllerAnimated(true, completion: nil)
    }
Inviare un messaggio con il linguaggio swift
Anche in questo caso, l’invio di un messaggio con MFMessageComposeViewController funziona solo su dispositivo reale e non su simulatore.

Considerazioni

Come spero di aver spiegato, inviare Email e Messaggi con il linguaggio Swift è abbastanza semplice e poco complesso. Il motivo reale che mi ha spinto a scrivere questo articolo riguardava più l’acquisizione di nuovi utenti per la propria applicazione.

Inviare una email, meglio ancora un messaggio, è uno strumento potentissimo per pubblicizzare un contenuto della tua applicazione. Spesso sono proprio i contatti telefonici personali che cominciano a scaricare la tua applicazione più per curiosità che per reale necessità.

Ovviamente tra i tuoi contatti ci sarà quello che sarà realmente interessato ed, automaticamente, potrebbe utilizzare la funzione di sponsorizzazione della tua applicazione per invogliare i propri contatti a scaricare la tua applicazione. Ma non voglio annoiarti con storie di questo tipo, anche perché, ci tornerò sicuramente in un nuovo articolo.

Dove andare da qui

Per rimanere in tema di condivisione e acquisizione utenti, ti consiglio di dare un’occhiata a questi articoli:

Download del progetto

[sociallocker][wpdm_package id=’41916′][/sociallocker]

Buona Programmazione!