2010-03-19 5 views
40

내 iPhone 앱이 MFMailComposeViewController 클래스를 사용하여 첨부 파일이있는 인앱 이메일을 전송합니다. MFMailComposeViewController 클래스의 "canSendMail"메소드가 true (예)를 반환하는 경우에만 앱이 메일 작성기 대화 상자를 표시하려고 시도합니다. 테스터의언제 [MFMailComposeViewController canSendMail]을 반환합니까?

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

팀은이 : 다음과 같은 방법이 YES를 반환하는 경우 특히, 그렇지 않으면 사용자가 디바이스에 설정된에는 이메일 계정이 없는지 오류 경고 대화 상자가 나타되게되어, 메일 작곡가를 보여줍니다 기기에 이메일 계정이 설정되어있는 경우에도 이러한 오류 알림 대화 상자가 표시됩니다. 테스터는 OS 3.1.3이 적용된 iPhone 3G를 사용했습니다. 따라서 MFMailComposeViewController 클래스가 있어야하며 "canSendMail"메서드는 NO를 반환해야합니다.

내 질문에 : 따라서 장치에서 전자 메일 계정이 설정되어 있지 않은 경우를 제외하고 "canSendMail"메서드는 NO를 반환 할 수있는 다른 상황이 있습니까?

~ 감사합니다

답변

69

, 다음 호출은 YES 반환해야합니다 :

[MFMailComposeViewController canSendMail] 

모든 계정이 제거/비활성화 반대로, 그것은 NO 반환합니다.

0

당신은 당신의 방법은 MFMailComposeViewController 기존 [MFMailComposeViewController canSendMail]NO을 반환하지 구별하지 않기 때문에 MFMailComposeViewController이 존재 틀림 없다고 확신 할 수 없습니다. 당신이 테스트하고

무엇 아이폰 OS는 관련이 없습니다; 응용 프로그램과 연결되는 iPhone SDK의 버전은 런타임에 MFMailComposeViewController를 사용할 수 있는지 여부를 결정합니다. 해당 클래스가 필요하면 SDK 3.0 이상을 사용하여 빌드해야합니다.

+0

감사합니다. 이 응용 프로그램은 기본 SDK 3.1.2로 구축되었으며 iPhone OS 배포 대상은 iPhone OS 3.0 – pythonquick

+0

Aha입니다. Base SDK와 별개로 iPhone OS Deployment Target을 설정하고 런타임에 클래스를 확인하는이 기술은 새로운 것입니다. 정말 멋진. – Tom

8

+canSendMail으로 대답하는 경우 기본 계정은 인 경우 으로 설정해야합니다.

+0

아, 재미있는 지적. 전자 메일 계정에서 (나가는) SMTP 서버를 제거하려고했습니다. 전자 메일 작성기 창이 열렸고 전자 메일은 계정의 보낼 편지함에 남았으므로 + [MFMailComposeViewController canSendMail]이 여전히 예를 반환했습니다. NO를 반환하는 유일한 방법은 모든 이메일 계정이 비활성화되었거나 완전히 제거 된 경우였습니다. 계정에서 전자 메일을 보낼 수없는 또 다른 방법이 있습니까, canSendMail은 NO를 반환합니까? – pythonquick

0

당신이 메시징 프레임 워크를 포함나요 (내부적으로 +[MFMailComposeViewController canSendMail]-isDefaultDeliveryAccount되는 첫 번째 메일 계정을 발견한다., +[MailAccountProxy defaultMailAccountForDelivery] 호출)? 한 번 비슷한 문제가 있었는데 올바른 프레임 워크를 XCode 프로젝트에 추가하는 것을 잊어 버렸기 때문에 문제가 발생했습니다. 하나 개 이상의 이메일 계정이 장치에서 활성화되어있는 경우

+0

예, MessageUI.framework가 포함되어 있습니다. 적어도 하나의 전자 메일 계정이 있으면 가능한 한 내 자체 테스트 장치에서 전자 메일 전송이 작동합니다. 따라서 MessageUI.framework가 올바르게 포함되어야합니다. – pythonquick

3

이것은 나를 위해 일했습니다. 장치에서

더 계정을 볼 수 있습니다 여기에

계정>, 캘린더 -을 설정 -> 메일, 연락처를 이동하는 것은 지금 계정를 추가 앱에 돌아가서 당신은 그것의 반환 예이를 찾을 수 있습니다 added.Now입니다 시간과 당신은 전자 메일을 보낼 수 있습니다. 감사합니다

4

canSendMail은 기기에 설정되지 않은 이메일 계정 외에도 타사 앱이 메일을 보내지 못하게 MDM 프로필이 설치 및 구성되면 NO을 반환합니다. 이 경우 openURL:mailto: URL을 사용하여 Mail.app를 시작하고 선택적으로 to, cc, bcc, 제목 및 본문 필드를 채워야합니다.

흔한 : RFC - https://tools.ietf.org/html/rfc2368

1

아이폰 OS 10.1의 경우, 당신은 (설정에서) 첫째 아이 클라우드에서 메일을 사용하도록 설정할 수 있습니다. 그런 다음 iCloud 계정에 로그인하십시오. 모든 연락처와 이메일은 변경 후 시뮬레이터에서 사용할 수 있어야합니다. 변화와

, 나는에서 true 얻을 수 있습니다 :

MFMailComposeViewController.canSendMail() 

내가 스위프트 3와 엑스 코드 8.1을 사용하고 있습니다를

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]]; 
} 
관련 문제