Quand renverra-t-il NO

Mon application iPhone utilise la classe MFMailComposeViewController pour envoyer un courrier électronique intégré à l’application avec une pièce jointe. L’application tente uniquement d’afficher la boîte de dialog de composition du courrier si la méthode “canSendMail” de la classe MFMailComposeViewController renvoie true (YES). Plus précisément, si la méthode suivante renvoie YES, le compositeur de messagerie apparaît, sinon l’utilisateur reçoit une boîte de dialog d’alerte indiquant qu’aucun compte de messagerie n’est configuré sur le périphérique:

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

Une équipe de testeurs a signalé qu’ils recevaient cette boîte de dialog d’alerte, même lorsque des comptes de messagerie étaient configurés sur le périphérique. Le testeur a utilisé un iPhone 3G avec OS 3.1.3. Par conséquent, la classe MFMailComposeViewController doit exister et la méthode “canSendMail” doit avoir renvoyé NO.

Ma question est donc la suivante: à part le cas où il n’y a pas de compte email mis en place sur l’appareil, dans quelles autres circonstances la méthode “canSendMail” peut-elle retourner NON?

~ Merci

Si au moins un compte de messagerie est activé sur le périphérique, l’appel suivant doit renvoyer YES:

 [MFMailComposeViewController canSendMail] 

Inversement, si tous les comptes sont désactivés / supprimés, il retournera NON.

Pour que +canSendMail retourne OUI, le compte par défaut doit être configuré pour l’envoi d’e-mails .

(En interne, +[MFMailComposeViewController canSendMail] appelle +[MailAccountProxy defaultMailAccountForDelivery] , qui trouve le premier compte de messagerie étant -isDefaultDeliveryAccount .)

En plus d’un compte de messagerie qui n’est pas configuré sur un périphérique, canSendMail renvoie également NO lorsqu’un profil MDM est installé et configuré pour ne pas autoriser les applications tierces à envoyer du courrier. Dans ce cas, vous devez utiliser openURL: avec un mailto: URL pour lancer Mail.app et éventuellement remplir les champs to, cc, bcc, subject et body.

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

Cela a fonctionné pour moi.

Dans Device Go–> Mail, Contacts, Calendar-> Accounts

Ici, vous pouvez voir qu’aucun compte n’est ajouté. Maintenant, ajoutez un compte maintenant, revenez à votre application et vous pouvez trouver son retour oui cette fois et vous pouvez envoyer un courrier électronique. Merci

Dans le cas d’iOS 10.1, vous pouvez d’abord activer le courrier depuis iCloud (dans Paramètres). Connectez-vous ensuite à votre compte iCloud. Tous les contacts et les e-mails doivent être disponibles dans votre simulateur après ces modifications.

Avec le changement, je peux être true de:

 MFMailComposeViewController.canSendMail() 

J’utilise Xcode 8.1 avec Swift 3.

[MFMailComposeViewController canSendMail] renverra NO lorsque vous n’avez aucun compte de messagerie sur le périphérique. Dans ce cas, vous pouvez ouvrir l’application de messagerie avec le code suivant:

 - (void)openMailApp { NSSsortingng *recipients = @"mailto:?cc=&subject="; NSSsortingng *body = @"&body="; NSSsortingng *email = [NSSsortingng ssortingngWithFormat:@"%@%@", recipients, body]; email = [email ssortingngByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; [[UIApplication sharedApplication] openURL:[NSURL URLWithSsortingng:email]]; } 

Vous ne pouvez pas être certain que MFMailComposeViewController doit avoir existé car votre méthode ne fait pas de distinction entre MFMailComposeViewController et [MFMailComposeViewController canSendMail] renvoyant NO .

Quel iPhone OS vous testez n’est pas pertinent; Quelle version du kit de développement logiciel (SDK) iPhone de votre application est liée à ce qui détermine si MFMailComposeViewController sera disponible à l’exécution. Si vous voulez cette classe, vous devez créer avec SDK 3.0 ou version ultérieure.

Avez-vous inclus la structure de messagerie? J’ai eu un problème similaire une fois et ce n’est que parce que j’ai oublié d’append le cadre correct au projet XCode.

La réponse de Vladimir sans fonctions obsolètes:

  NSSsortingng *recipients = @"mailto:testingEmail@example.com?subject=emailsubject"; NSSsortingng *body = @"&body=body:"; NSSsortingng *email = [NSSsortingng ssortingngWithFormat:@"%@%@", recipients, body]; email = [email ssortingngByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]]; [[UIApplication sharedApplication] openURL:[NSURL URLWithSsortingng:email] options:@{} completionHandler:^(BOOL success) { }];