2013년 11월 3일 일요일

[iOS6] App내에서 이메일을 보내자.

개발하는 App 안에서 개발자에게 문제점이나 요청사항을 보낼 수 있는 기능이 있어야 합니다.
즉, 개발자에게 이런 저런 기능이 있으면 좋겠다거나, 이럴때 문제가 발생해서 불편하다거나 하는 내용을 개발자에게 보낼 수 있는 기능은 있어야 합니다.
 간단하게 MFMailComposeViewController를 사용해서, 기본으로 제공하는 이메일을 사용할 수 있습니다.

위와 같이 Framework은 MessageUI를 추가해 주시고, 사용하는 곳에서
#import <MessageUI/MessageUI.h>를 해주시면 사용할 수 있습니다.
메일 보내기 위해서, MFMailComposeViewController를 만들고, 메일에 들어갈 내용을 각각 넣어 줍니다.

NSString *iOSVersion = [[UIDevice currentDevice] systemVersion];
    NSString *model = [[UIDevice currentDevice] model];
    NSString *version = FGS_VERSION;
    NSString *build = FGS_BUILD;
    MFMailComposeViewController *mailComposer = [[MFMailComposeViewController alloc] init];
    mailComposer.mailComposeDelegate = self;
    [mailComposer setToRecipients:[NSArray arrayWithObjects: @"ask.davidbae@gmail.com",nil]];
    [mailComposer setSubject:[NSString stringWithFormat: @"%@ V%@ (build %@) Support", NSLocalizedString(@"Family GoStop", @"App Name"),version,build]];
    NSString *supportText = [NSString stringWithFormat:@"[Device: %@]\n[iOS Version:%@]\n",model,iOSVersion];
    supportText = [supportText stringByAppendingString: NSLocalizedString(@"Please describe your problem or question.", @"")];
    [mailComposer setMessageBody:supportText isHTML:NO];

    [self presentViewController:mailComposer animated:YES completion:nil];

그리고, 호출하는 클래스에서 MFMailComposeViewControllerDelegate 프로토콜을 추가해 주시고, 아래 함수를 구현하면, 메일이 정상적으로 보내졌는지 확인이 가능합니다.

#pragma mark - MFMailComposeViewControllerDelegate

- (void)mailComposeController:(MFMailComposeViewController *)controller
          didFinishWithResult:(MFMailComposeResult)result
                        error:(NSError *)error
{
    [self dismissViewControllerAnimated:YES completion:nil];
    /*
     enum MFMailComposeResult {
     MFMailComposeResultCancelled,
     MFMailComposeResultSaved,
     MFMailComposeResultSent,
     MFMailComposeResultFailed
     };
     */
    NSLog(@"Email Send Result: %d", result);
    if (result == MFMailComposeResultFailed) {
        NSLog(@"Support mail failed: Error Code:%d, %@", error.code, [error description]);
    }
}
위에서 result값으로 보내 졌는지, 취소 되었는지, 실패 되었는지 확인이 가능합니다.
그리고, 메일을 보내기 위해서, Compose를 보여주기 전에, 실제 메일을 보낼 수 있는지 확인이 되어야 합니다.
그러기 위해서는, 클래스 메소드를 사용하여 확인이 가능합니다.

    [MFMailComposeViewController canSendMail]

위 확인코드는 메일을 보내기 위한 버튼을 보여주기 전에 확인하여야 하고, 메일을 보낼 수 없는 경우, 사용자에게 메일 작성 화면을 보여주면 안됩니다.
 왜? 어렵게 메일을 작성했는데, 메일 설정이 안되어 있어서 보낼 수 없으면, 허탈하겠죠.
이상입니다.