2010-03-19 10 views
40

Mi aplicación de iPhone está utilizando la clase MFMailComposeViewController para enviar un correo electrónico integrado en la aplicación con un archivo adjunto. La aplicación solo intentará mostrar el diálogo de compositor de correo si el método "canSendMail" de la clase MFMailComposeViewController devuelve verdadero (YES). En concreto, si el siguiente método devuelve SÍ, se muestra el editor de correo, de lo contrario el usuario se presenta con indicando un diálogo de alerta de error que no hay cuentas de correo electrónico configuradas en el dispositivo:Cuándo [MFMailComposeViewController canSendMail] devolverá NO

- (BOOL)canDeviceSendEmail 
{ 
    Class mailClass = (NSClassFromString(@"MFMailComposeViewController")); 
    return mailClass != nil && [mailClass canSendMail]; 
} 

Un equipo de probadores tienen informaron que reciben este diálogo de alerta de error, incluso cuando las cuentas de correo electrónico están configuradas en el dispositivo. El probador usó un iPhone 3G con OS 3.1.3. Por lo tanto, la clase MFMailComposeViewController debe haber existido y el método "canSendMail" debe haber devuelto NO.

Mi pregunta es por lo tanto: aparte del caso cuando no hay cuentas de correo electrónico configuradas en el dispositivo, ¿en qué otras circunstancias puede el método "canSendMail" devolver NO?

~ Gracias

Respuesta

69

Si al menos una cuenta de correo electrónico está activado en el dispositivo, la siguiente llamada debe devolver SÍ:

[MFMailComposeViewController canSendMail] 

el contrario, si todas las cuentas están desactivadas/eliminado, volverá NO.

0

No se puede estar seguro de que debe haber existido MFMailComposeViewController debido a que su método no discrimina entre MFMailComposeViewController no existente y volver [MFMailComposeViewController canSendMail]NO.

Lo que el sistema operativo del iPhone que está probando no es relevante; En qué versión del SDK de iPhone se vincula su aplicación es lo que determina si MFMailComposeViewController estará disponible en tiempo de ejecución. Si desea esa clase, debe compilar con SDK 3.0 o posterior.

+0

Gracias por eso. La aplicación se creó con base SDK 3.1.2 y el objetivo de implementación del iPhone OS es iPhone OS 3.0 – pythonquick

+0

Aha. Esta técnica de establecer el destino de implementación del iPhone OS por separado del SDK base y verificar en tiempo de ejecución las clases es algo nuevo para mí. Muy genial. – Tom

8

Para +canSendMail para devolver SÍ, la cuenta predeterminada debe configurarse para enviar correos electrónicos.

(Internamente, +[MFMailComposeViewController canSendMail] llama +[MailAccountProxy defaultMailAccountForDelivery], que encuentra la primera cuenta de correo siendo -isDefaultDeliveryAccount.)

+0

Ah, punto interesante. Traté de eliminar el servidor SMTP (saliente) de la cuenta de correo electrónico. Abrió la ventana del compositor de correo electrónico y el correo electrónico permaneció en la Bandeja de salida de la cuenta, por lo que + [MFMailComposeViewController canSendMail] aún devolvió SÍ. La única forma de devolverlo NO fue cuando todas las cuentas de correo electrónico se desactivaron o se eliminaron por completo. ¿Hay alguna otra forma en que una cuenta no pueda enviar correos electrónicos, de modo que canSendMail devuelva NO? – pythonquick

0

¿Incluyó el marco de mensajería? Tuve un problema similar una vez y fue solo porque olvidé agregar el marco correcto al proyecto XCode.

+0

Sí, se incluye el marco MessageUI. En mi propio dispositivo de prueba, el correo electrónico funciona, siempre que haya al menos una cuenta de correo electrónico habilitada. Por lo tanto, el MessageUI.framework debe incluirse correctamente. – pythonquick

3

Esto funcionó para mí.

En Device Ir Configuración-> Mail, Contactos, Calendario-> Cuentas

Aquí se puede ver sin tener en cuenta es added.Now añadir cuenta ahora volver a su aplicación y se puede encontrar su regreso sí, esto tiempo y usted puede enviar un correo electrónico. Gracias

4

Además de una cuenta de correo electrónico no ser la configuración en un dispositivo, canSendMail también devuelve NO cuando un perfil MDM está instalado y configurado para no permitir aplicaciones de terceros para enviar correo. En este caso, debe usar openURL: con una URL mailto: para iniciar Mail.app y, opcionalmente, rellenar el campo to, cc, bcc, subject y body.

mailto: RFC - https://tools.ietf.org/html/rfc2368

1

En caso de IOS 10.1, puede activar el correo de iCloud primera (en Configuración). Luego, inicia sesión en tu cuenta de iCloud. Todos los contactos y correos electrónicos deberían estar disponibles en su simulador después de esos cambios.

Con el cambio, puedo conseguir true de:

MFMailComposeViewController.canSendMail() 

estoy usando Xcode 8.1 con Swift 3.

0

[MFMailComposeViewController canSendMail] volverá NO cuando usted no tiene ninguna cuenta de correo en el dispositivo. En este caso, puede abrir la aplicación de correo con el siguiente código:

- (void)openMailApp { 
    NSString *recipients = @"mailto:?cc=&subject="; 
    NSString *body = @"&body="; 
    NSString *email = [NSString stringWithFormat:@"%@%@", recipients, body]; 
    email = [email stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; 
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:email]]; 
} 
Cuestiones relacionadas