什么时候[MFMailComposeViewController canSendMail]会返回NO

时间:2010-03-19 22:49:44

标签: iphone objective-c

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

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

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

因此,我的问题是:除了设备上没有设置电子邮件帐户的情况外,“canSendMail”方法在其他情况下是否会返回NO?

〜谢谢

9 个答案:

答案 0 :(得分:70)

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

[MFMailComposeViewController canSendMail]

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

答案 1 :(得分:10)

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

(在内部,+[MFMailComposeViewController canSendMail]调用+[MailAccountProxy defaultMailAccountForDelivery],查找第一个邮件帐户为-isDefaultDeliveryAccount。)

答案 2 :(得分:6)

除了未在设备上设置的电子邮件帐户外,当安装MDM配置文件并将其配置为不允许第三方应用程序发送邮件时,canSendMail也会返回NO。在这种情况下,您必须使用openURL:mailto:网址才能启动Mail.app,并可选择填写to,cc,bcc,subject和body字段。

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

答案 3 :(得分:3)

这对我有用。

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

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

答案 4 :(得分:1)

对于iOS 10.1,您可以先从iCloud启用邮件(在“设置”中)。然后登录您的iCloud帐户。在这些更改后,您的模拟器中应该可以使用所有联系人和电子邮件。

通过更改,我可以从{<1}}获取:

true

我正在使用Xcode 8.1和Swift 3。

答案 5 :(得分:1)

当您在设备上没有任何邮件帐户时,

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

答案 6 :(得分:0)

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

您正在测试的iPhone操作系统不相关;您的应用程序链接的iPhone SDK的哪个版本决定了MFMailComposeViewController在运行时是否可用。如果您需要该类,则需要使用SDK 3.0或更高版本构建。

答案 7 :(得分:0)

您是否包含消息传递框架?我有一个类似的问题,只是因为我忘了将正确的框架添加到XCode项目中。

答案 8 :(得分:0)

弗拉基米尔的回答没有弃用的功能:

    NSString *recipients = @"mailto:testingEmail@example.com?subject=emailsubject";

    NSString *body = @"&body=body:";
    NSString *email = [NSString stringWithFormat:@"%@%@", recipients, body];
    email = [email stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]];
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:email] options:@{} completionHandler:^(BOOL success) {
    }];