何时会返回NO

我的iPhone应用程序正在使用MFMailComposeViewController类来发送附件中的应用程序内电子邮件。 如果MFMailComposeViewController类的“canSendMail”方法返回true(YES),应用程序将只尝试显示邮件编辑器对话框。 具体而言,如果以下方法返回YES,则显示邮件编辑器,否则向用户显示错误警报对话框,指出在设备上没有设置电子邮件帐户:

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

一组testing人员报告说,即使在设备上设置了电子邮件帐户,他们也会得到此错误警报对话框。 testing人员使用了带有OS 3.1.3的iPhone 3G。 因此,MFMailComposeViewController类必须已经存在,并且“canSendMail”方法必须返回NO。

因此,我的问题是:除了在设备上没有设置电子邮件账户的情况之外,“canSendMail”方法还能在什么情况下返回NO?

〜谢谢

如果设备上至less启用了一个电子邮件帐户,则以下呼叫应返回YES:

 [MFMailComposeViewController canSendMail] 

相反,如果所有帐户都被禁用/删除,它将返回NO。

对于+canSendMail返回YES,则必须设置默认帐户以发送电子邮件

(在内部, +[MFMailComposeViewController canSendMail]调用+[MailAccountProxy defaultMailAccountForDelivery] ,它发现第一个邮件帐户是-isDefaultDeliveryAccount 。)

这对我有效。

在设备转到设置 – >邮件,通讯录,日历 – >帐户

在这里你可以看到没有帐户添加。现在, 添加帐户回到你的应用程序,你可以find它返回的是,这一次,你可以发送电子邮件。 谢谢

除了未在设备上设置电子邮件帐户之外,安装MDMconfiguration文件并configuration为不允许第三方应用程序发送邮件时, canSendMail也会返回NO 。 在这种情况下,您必须使用openURL:带有mailto: URL才能启动Mail.app,并可以select填入to,cc,bcc,主题和正文字段。

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

对于iOS 10.1,您可以先从iCloud启用邮件(在“设置”中)。 然后login到您的iCloud帐户。 所有的联系人和电子邮件应该可以在你的模拟器中的变化后。

随着变化,我可以从:

 MFMailComposeViewController.canSendMail() 

我正在用Swift 3使用Xcode 8.1。

您不能确定MFMailComposeViewController必须存在,因为您的方法不区分MFMailComposeViewController不存在和[MFMailComposeViewController canSendMail]返回NO

您正在testing的iPhone OS不相关; 您的应用程序链接的iPhone SDK版本是什么决定了MFMailComposeViewController是否在运行时可用。 如果你想要这个类,你需要使用SDK 3.0或更高版本来构build。

你有没有包含消息框架? 我曾经有一个类似的问题,只是因为我忘了将正确的框架添加到XCode项目。

[MFMailComposeViewController canSendMail]将在设备上没有任何邮件帐户时返回NO。 在这种情况下,您可以通过以下代码打开邮件应用程序:

 - (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]]; }