2010-03-19 69 views
40

我的iPhone應用程序正在使用MFMailComposeViewController類來發送附件中的應用程序內電子郵件。 如果MFMailComposeViewController類的「canSendMail」方法返回true(YES),則應用程序將只嘗試顯示郵件編輯器對話框。特別是,如果下面的方法返回YES,它顯示郵件撰寫,否則用戶會看到一個錯誤提示對話框,說明有建立在設備上沒有電子郵件帳戶:什麼時候[MFMailComposeViewController canSendMail]返回NO

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

測試人員組成的團隊有報告他們即使在設備上設置了電子郵件帳戶時也會收到此錯誤警報對話框。測試者使用了帶有OS 3.1.3的iPhone 3G。因此MFMailComposeViewController類必須已經存在,並且「canSendMail」方法必須返回NO。

因此,我的問題是:除了在設備上沒有設置電子郵件帳戶的情況之外,「canSendMail」方法還可以返回NO嗎?

〜感謝

回答

69

如果至少有一個電子郵件帳戶在設備上啓用,下面的調用應返回YES:

[MFMailComposeViewController canSendMail] 

相反,如果所有的帳戶被禁用/刪除,否則返回NO。

0

你不能肯定,MFMailComposeViewController必須已經存在,因爲你的方法不MFMailComposeViewController不存在和[MFMailComposeViewController canSendMail]返回NO區分。

您正在測試的iPhone OS不相關;您的應用程序鏈接的iPhone SDK版本是什麼決定了MFMailComposeViewController在運行時是否可用。如果您需要該類,則需要使用SDK 3.0或更高版本進行構建。

+0

感謝。該應用程序使用基礎SDK 3.1.2構建,iPhone OS部署目標是iPhone OS 3.0 – pythonquick 2010-03-20 00:28:53

+0

Aha。這種將iPhone操作系統部署目標與基本SDK分開並在運行時檢查課程的技術對我來說是新的。很酷。 – Tom 2010-03-20 00:59:22

8

對於​​要返回YES,必須設置默認帳戶用於發送電子郵件

(在內部,+[MFMailComposeViewController canSendMail]調用+[MailAccountProxy defaultMailAccountForDelivery],它找到的第一個郵件帳戶被-isDefaultDeliveryAccount。)

+0

啊,有趣的一點。我嘗試從電子郵件帳戶中刪除(外發)SMTP服務器。它打開了電子郵件編輯器窗口,並且電子郵件停留在帳戶的發件箱中,因此+ [MFMailComposeViewController canSendMail]仍然返回YES。使所有電子郵件帳戶被禁用或完全刪除的唯一方法是使其返回NO。有沒有另一種方式帳戶將無法發送電子郵件,以便canSendMail返回NO? – pythonquick 2010-03-20 16:29:00

0

你包括信息框架?我曾經有過類似的問題,只是因爲我忘了將正確的框架添加到XCode項目中。

+0

是的,包含MessageUI.framework。在我自己的測試設備上,只要至少有一個電子郵件帳戶,就可以使用電子郵件。所以MessageUI.framework必須正確包含。 – pythonquick 2010-03-21 14:32:33

3

這對我有效。

在設備進入設置 - >郵件,通訊錄,日曆 - >賬戶

在這裏你可以看到不考慮是added.Now 添加帳戶現在回到你的應用程序,你可以找到它的返回是這個時間,你可以發送電子郵件。 感謝

4

除了不是在設備上設置的電子郵件帳戶,canSendMail當MDM配置文件安裝和配置,不允許第三方應用程序來發送郵件也返回NO。在這種情況下,您必須使用openURL:mailto: URL才能啓動Mail.app,並可以選擇填入to,cc,bcc,主題和正文字段。

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

1

在iOS的10.1的情況下,可以實現從iCloud中第一個(在設置)的郵件。然後登錄到您的iCloud帳戶。這些更改後,所有聯繫人和電子郵件都應該在模擬器中可用。

有了變化,我可以從true

MFMailComposeViewController.canSendMail() 

我使用的Xcode 8.1斯威夫特3.

0

[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]]; 
} 
相關問題