Sviluppatore iOS — Invia e-mail
L'e-mail è uno dei migliori canali di comunicazione del 21° secolo. Le informazioni possono essere consegnate a un gruppo di destinatari in pochi secondi. Hai mai pensato di integrare la funzione email nella tua app?
Apple ha fornito un framework semplice da usare MessageUI
per gli sviluppatori. Possiamo configurare le seguenti proprietà:
- Elenco destinatari
- Argomento
- Corpo del messaggio
- Allegati
Procedura passo dopo passo
Passaggio 1) Verificare se il dispositivo può inviare e-mail
import MessageUI
// Confirm the user can send email
guard MFMailComposeViewController.canSendMail() else { return }
1. L'utente dell'app non ha ancora configurato il proprio account e-mail nell'app di posta del sistema
2. Il profilo MDM iOS ha disabilitato la funzione di invio, facendo riferimento a questa risposta StackOverflow .
Passaggio 2) Configurare l'istanza MFMailComposeViewController
// Construct the `MFMailComposeViewController` instance
let mfMailComposeViewController = MFMailComposeViewController()
// To set the recipients list, including the to, cc and bcc fields
mfMailComposeViewController.setToRecipients(["[email protected]"])
mfMailComposeViewController.setCcRecipients(["[email protected]"])
mfMailComposeViewController.setBccRecipients(["[email protected]"])
// To set the email subject
mfMailComposeViewController.setSubject("Example - Subject Text")
// To set the email message body; It can be either plain text or HTML message
mfMailComposeViewController.setMessageBody("<h1>Example - HTML message body </h1>", isHTML: true)
// Presenet the `MFMailComposeViewController` to the app user
present(mfMailComposeViewController, animated: true)
- L'elenco dei destinatari, inclusi
to
,cc
&bcc
- Il campo tematico
- Il corpo del messaggio in testo normale o messaggio HTML
Passaggio 3) Chiudere manualmente MFMailComposeViewController
// We must implement the `MFMailComposeViewControllerDelegate` in order to handle the user's action on the mail compo
mfMailComposeViewController.mailComposeDelegate = self
extension DemoViewController: MFMailComposeViewControllerDelegate {
// This is the only callback from the Mail composer to notify the app that the user has carried out certain action
func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
switch result {
case .cancelled:
print("The user has dismissed the mail composer and deleted the email draft.")
case .saved:
print("The user has dismissed the mail composer and saved the email draft.")
case .sent:
// The email request is queued in the user's mail app
// There is no guarantee that the email is actually sent out!!!
print("The user has \"sent\" the email out.")
case .failed:
print("The user cannot send out the email")
print("Error of sending out the email: \(error.debugDescription)")
}
controller.dismiss(animated: true)
}
}
C'è anche una result
proprietà per mostrare l'azione dell'utente, tra cui:
cancelled
— L'utente ha fatto clic sul pulsante "Annulla" e quindi ha eliminato la bozza dell'e-mailsaved
— L'utente ha fatto clic sul pulsante "Annulla" e quindi ha salvato la bozza dell'e-mailsent
— L'utente ha *inviato* l'e-mailfail
— Si è verificato un errore nell'accodare l'e-mail all'app di posta
Trucco: l'e-mail VERAMENTE inviata quando viene restituito il risultato "inviato"?
Hai provato a inviare l'e-mail quando non c'è connessione di rete, ad esempio in modalità aereo? Ah NO ! Il didFinishWith
callback di MFMailComposeViewControllerDelegate
restituisce effettivamente un sent
risultato!!!
Cosa significa?
Secondo la documentazione Apple di seguito, MFMailComposeViewController
invia solo una richiesta al programma di posta di sistema per mettere in coda l'e-mail invece di inviarla !!!
Documentazione ufficiale Apple — mailComposeController(_:didFinishWith:error:):
Se l'utente ha scelto di inviare l'e-mail creata da questa interfaccia, quell'e-mail dovrebbe essere accodata nel programma di posta dell'utente quando questo metodo viene chiamato . Se si è verificato un errore durante l'accodamento del messaggio di posta elettronica, il error
parametro contiene un oggetto errore che indica il tipo di errore che si è verificato.
In altre parole, l'app non può MAI sapere se l'e-mail è stata inviata correttamente ai destinatari.
Funzionalità avanzata: aggiunta di un allegato all'e-mail
L'invio di allegati è una funzione rara nella maggior parte dei casi d'uso. Tuttavia, MFMailComposeViewController
ci consente di allegare un elenco di allegati in qualsiasi formato di file all'e-mail composta.
// Attach an image to the composed email
let attachmentImageData = UIImage(named: "example_image_name")!.pngData()!
mfMailComposeViewController.addAttachmentData(attachmentImageData, mimeType: "image/png", fileName: "example_file_name")
Per saperne di più
Esistono molti altri modi per inviare e-mail. Firebase Extension Trigger Email fornisce uno strumento di facile utilizzo per aiutare gli sviluppatori a inviare e-mail creando un documento Firestore con specifici campi predefiniti. Di seguito è riportato il mio altro blog sull'estensione Trigger Email. Siete invitati a leggerlo se volete saperne di più.
Estensione Firebase: attiva l'e-mailConclusione
Apple fornisce un framework facile da usare MessageUI
per aiutare le app a inviare e-mail delegando il lavoro all'app di mailing del sistema. L'app può impostare l'elenco dei destinatari, l'oggetto, il corpo del messaggio e l'elenco degli allegati. Una volta che l'utente ha un'azione, MFMailComposeViewControllerDelegate
restituisce il risultato e l'app deve chiuderlo MFMailComposeViewController
manualmente.
Tieni presente che il sent
risultato di MFMailComposeViewControllerDelegate
non significa realmente che l'e-mail è stata inviata. La richiesta di posta elettronica viene messa in coda solo nell'app di posta del sistema!
Spero che questo blog ti piaccia e ti auguro una buona giornata!