2010-03-19 11 views
40

Meine iPhone-App verwendet die MFMailComposeViewController-Klasse, um eine In-App-E-Mail mit einem Anhang zu senden. Die App wird nur versuchen, den Mail-Composer-Dialog anzuzeigen, wenn die Methode "canSendMail" der Klasse MFMailComposeViewController true (YES) zurückgibt. Insbesondere dann, wenn die folgende Methode JA zurückgibt, zeigt es den Mail-Komponisten, sonst wird der Benutzer mit einer Fehler Warnmeldung präsentiert die besagt, dass es keine E-Mail-Konten auf dem Gerät eingerichtet:Wann wird [MFMailComposeViewController canSendMail] zurückgeben?

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

Ein Team von Testern hat haben berichtet, dass sie diesen Fehlerwarnungsdialog erhalten, selbst wenn E-Mail-Konten auf dem Gerät eingerichtet sind. Der Tester verwendete ein iPhone 3G mit OS 3.1.3. Daher muss die Klasse MFMailComposeViewController vorhanden sein, und die Methode "canSendMail" muss NO zurückgegeben haben.

Meine Frage ist daher: Abgesehen von dem Fall, wenn auf dem Gerät keine E-Mail-Accounts eingerichtet sind, unter welchen Umständen kann die "canSendMail" -Methode NEIN zurückgeben?

~ Dank

Antwort

69

Wenn mindestens ein E-Mail-Konto auf dem Gerät aktiviert ist, sollte der folgende Aufruf JA Rückkehr:

[MFMailComposeViewController canSendMail] 

Umgekehrt, wenn alle Konten deaktiviert/entfernt sind, wird es zurückgeben NO.

0

Sie nicht sicher sein können, dass MFMailComposeViewController bestanden haben muss, weil Ihre Methode nicht zwischen bestehenden MFMailComposeViewController nicht und [MFMailComposeViewController canSendMail]NO zurück.

Das iPhone OS, auf dem Sie testen, ist nicht relevant. Die Version des iPhone SDK, mit der Ihre Anwendung verknüpft ist, legt fest, ob MFMailComposeViewController zur Laufzeit verfügbar ist. Wenn Sie diese Klasse möchten, müssen Sie mit SDK 3.0 oder höher erstellen.

+0

Vielen Dank dafür. Die App wurde mit Basis-SDK 3.1.2 gebaut und das iPhone OS Deployment Target ist iPhone OS 3.0 – pythonquick

+0

Aha. Diese Technik, das iPhone OS Deployment Target vom Base SDK zu trennen und zur Laufzeit auf Klassen zu prüfen, ist neu für mich. Ziemlich cool. – Tom

8

Für +canSendMail, um JA zurückgeben, muss das Standardkonto zum Senden von E-Mails eingerichtet werden.

(Intern +[MFMailComposeViewController canSendMail] ruft +[MailAccountProxy defaultMailAccountForDelivery], die die erste Mail-Konto findet -isDefaultDeliveryAccount zu sein.)

+0

Ah, interessanter Punkt. Ich habe versucht, den (ausgehenden) SMTP-Server aus dem E-Mail-Konto zu entfernen. Es öffnete das E-Mail-Composer-Fenster, und die E-Mail blieb im Postausgang des Kontos, sodass + [MFMailComposeViewController canSendMail] immer noch YES zurückgab. Die einzige Möglichkeit, um NEIN zurückzugeben, war, wenn alle E-Mail-Konten entweder deaktiviert oder vollständig entfernt wurden. Gibt es eine andere Möglichkeit, wie ein Account keine E-Mails versenden kann, so dass canSendMail NEIN zurückgibt? – pythonquick

0

Haben Sie den Messaging Framework enthalten? Ich hatte ein ähnliches Problem einmal und es war nur, weil ich vergessen habe, dem XCode-Projekt das richtige Framework hinzuzufügen.

+0

Ja, das MessageUI.framework ist enthalten. Auf meinem eigenen Testgerät funktioniert das E-Mailing, solange mindestens ein E-Mail-Konto aktiviert ist. Daher muss das MessageUI.framework korrekt enthalten sein. – pythonquick

3

Das funktionierte für mich.

In Device gehen Abbinde-> Mail, Kontakte, Kalender-> Konten

Hier können Sie noch keinen Account sehen ist added.Now Konto hinzufügen jetzt zu Ihrer App zurück und man kann seine Rückkehr ja diese finden Zeit und Sie können E-Mail senden. Dank

4

Neben ein E-Mail-Konto nicht auf einem Gerät zu sein Setup, canSendMail gibt auch NO wenn ein MDM-Profil installiert und konfiguriert ist, um nicht Anwendungen von Drittanbietern zu erlauben, E-Mail zu senden. In diesem Fall müssen Sie openURL: mit einer mailto: URL verwenden, um Mail.app zu starten und optional das Feld "to", "cc", "bcc", "subject" und "body" ausfüllen.

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

1

Bei iOS 10.1, können Sie E-Mails von iCloud ersten (in den Einstellungen) ermöglichen. Melden Sie sich dann bei Ihrem iCloud-Konto an. Alle Kontakte und E-Mails sollten nach diesen Änderungen in Ihrem Simulator verfügbar sein.

Mit dem Wechsel, kann ich true aus:

MFMailComposeViewController.canSendMail() 

Ich bin mit Xcode 8.1 mit Swift 3.

0

[MFMailComposeViewController canSendMail] wird NO zurück, wenn Sie haben kein E-Mail-Konto auf dem Gerät. In diesem Fall können Sie die Mail-App mit dem folgenden Code öffnen:

- (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]]; 
} 
Verwandte Themen