我的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?
〜谢谢
答案 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) {
}];