何时会返回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]]; }