【问题标题】:When will [MFMailComposeViewController canSendMail] return NO[MFMailComposeViewController canSendMail] 什么时候返回 NO
【发布时间】:2011-01-29 16:14:16
【问题描述】:

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

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

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

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

~谢谢

【问题讨论】:

    标签: iphone objective-c


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。该应用程序是使用基础 SDK 3.1.2 构建的,iPhone OS 部署目标是 iPhone OS 3.0
    • 啊哈。这种将 iPhone OS 部署目标与 Base SDK 分开并在运行时检查类的技术对我来说是新的。很酷。
    【解决方案2】:

    要让+canSendMail 返回“是”,必须设置默认帐户用于发送电子邮件

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

    【讨论】:

    • 啊,有趣的一点。我尝试从电子邮件帐户中删除(传出)SMTP 服务器。它打开了电子邮件编辑器窗口,电子邮件留在了帐户的发件箱中,所以 +[MFMailComposeViewController canSendMail] 仍然返回 YES。让它返回 NO 的唯一方法是禁用或完全删除所有电子邮件帐户。是否有另一种方式帐户将无法发送电子邮件,因此 canSendMail 返回 NO?
    【解决方案3】:

    您是否包含消息传递框架?我曾经遇到过类似的问题,只是因为我忘记将正确的框架添加到 XCode 项目中。

    【讨论】:

    • 是的,MessageUI.framework 已包含在内。在我自己的测试设备上,电子邮件确实有效,只要至少有一个电子邮件帐户,就可以了。因此必须正确包含 MessageUI.framework。
    【解决方案4】:

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

    [MFMailComposeViewController canSendMail]
    

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

    【讨论】:

    • 旧但今天仍然适用;它不适用于第三方电子邮件客户端,仅适用于 Apple 默认电子邮件客户端。
    【解决方案5】:

    这对我有用。

    在 Device Go 设置->邮件、通讯录、日历->帐户中

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

    【讨论】:

      【解决方案6】:

      除了未在设备上设置电子邮件帐户外,canSendMail 还会在安装 MDM 配置文件并将其配置为不允许第三方应用发送邮件时返回 NO。在这种情况下,您必须使用 openURL:mailto: URL 来启动 Mail.app 并可选择填写收件人、抄送、密送、主题和正文字段。

      mailto: RFC

      【讨论】:

        【解决方案7】:

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

        通过更改,我可以从以下位置获得true

        MFMailComposeViewController.canSendMail()
        

        我正在使用 Xcode 8.1 和 Swift 3。

        【讨论】:

          【解决方案8】:

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

          【讨论】:

            【解决方案9】:

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

                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) {
                }];
            

            【讨论】:

              猜你喜欢
              • 2019-06-18
              • 1970-01-01
              • 2012-08-17
              • 1970-01-01
              • 1970-01-01
              • 2014-10-25
              • 2014-11-04
              • 1970-01-01
              • 2021-10-11
              相关资源
              最近更新 更多