iOS SDK 在app中增加发送邮件功能

#iOS SDK 在app中增加发送邮件功能

翻译自 iOS SDK: Send E-mail In-App. 版权所有, 转载请著明出处,保留链接。

在这篇ioS开发向导中,我会演示使用MFMailComponseViewController类来发送邮件,而不需要离开app。我们会建立关于收件人,邮件主题,邮件内容,甚至附件的邮件模板。

在应用程序中,iOS SDK提供了一个简单,标准的接口让用户了发送和编辑邮件,即MFMailComposeViewController类。这个视图控制器呈现一个标准的邮件接口,并且提供了反应用户操作事件功能接口。例如,当用户点击“发送”或“取消”时,这个类会收到消息并通知你。

注意:MFMailComposeViewController只有在iOS 3.0以后的版本中才能用。

那么,它是怎么工作的呢?请跟随本向导的脚步。

##第一步 创建一个Xcode工程
打开Xcode并且选择”Create a new Xcode project”. 选择View-based Application并点击下一步,输入工程名,例如”Mail”.输入公司标识,并且确信选择了”iPhone”设备系列,因为我们将创建的是一个iPhone app. 选择下一步,找一个目录存储工程,然后点击创建。

1

##第二步:增加Mail按钮
打开”MailViewController.xil”文件,并拖拽一个按钮到视图上,设置按钮的标题为”Mail”。在编辑器中选择中间的按钮来显示”Assistant editor”,以便我们能够在刚创建的按钮上增加action.

2

选择按钮,并CTRL-drag到”MailViewController.h”, 在弹出框中,输入openMail名称,并且确保设置为”Action”连接类型,因为我们想要一个action而不是outlet.

3

##第三步 引入MessageUI框架
在Xcode4的导航栏中,选择工程名。下一步,选择当前目标(“Mail”), 然后选择”Build Phases”.展开”Link Binary With Libraries”选择,点击”+”按钮增加一个新框架。在搜索框中输入”message”,然后在出现的列表中选择MessageUI.framework。点击”Add”,在工程的连接阶段包含此框架。

至此,你已在你的工程中增加了MessageUI 框架,在需要使用MFMailComposeViewController的视图控制器中需要引入该框架,此例中,是MailViewController.h视图。

找到该文件并修改代码如下:

#import <UIKit/UIKit.h>
#import <MessageUI/MessageUI.h>

@interface MailViewController : UIViewController <MFMailComposeViewControllerDelegate>
- (IBAction)openMail:(id)sender;
@end

正如你看到的,在上述代码中我们声明了MFMailComposeViewControllerDelegate, 将使用该代理来查看发送邮件的结果。

##第四步 增加资源到工程中
把下面的图片拖拽到”Supporting Files”文件夹中,确保勾选了”Copy items into destination group’s folder”。

4

##第五步 检查设备是否能够发送邮件
打开”MailViewController.m”文件,并定位到openMail:动作处,并修改代码如下:

- (IBAction)openMail:(id)sender 
{
    if ([MFMailComposeViewController canSendMail])
    {

    }
    else
    {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Failure"
                                                    message:@"Your device doesn't support the composer sheet"
                                                   delegate:nil
                                          cancelButtonTitle:@"OK"
                                          otherButtonTitles:nil];
        [alert show];
        [alert release];
    }
}

此处,我们利用MFMailComposeViewController的canSendMail方法检查当前设备是否能够发送邮件。在打开邮件接口前,必须要调用此方法。如果设备不能发送邮件,应该通知用户(例如使用UIAlertView)。

##第六步 显示Mail界面
如果设备现在能够发送邮件,则显示邮件界面,定位到openMail:方法,修改代码如下:

- (IBAction)openMail:(id)sender 
{
    if ([MFMailComposeViewController canSendMail])
    {
        MFMailComposeViewController *mailer = [[MFMailComposeViewController alloc] init];

        mailer.mailComposeDelegate = self;

        [mailer setSubject:@"A Message from MobileTuts+"];

        NSArray *toRecipients = [NSArray arrayWithObjects:@"[email protected]", @"[email protected]", nil];
        [mailer setToRecipients:toRecipients];

        UIImage *myImage = [UIImage imageNamed:@"mobiletuts-logo.png"];
        NSData *imageData = UIImagePNGRepresentation(myImage);
        [mailer addAttachmentData:imageData mimeType:@"image/png" fileName:@"mobiletutsImage"]; 

        NSString *emailBody = @"Have you seen the MobileTuts+ web site?";
        [mailer setMessageBody:emailBody isHTML:NO];

        [self presentModalViewController:mailer animated:YES];

        [mailer release];
    }
    else
    {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Failure"
                                                    message:@"Your device doesn't support the composer sheet"
                                                   delegate:nil
                                          cancelButtonTitle:@"OK"
                                          otherButtonTitles: nil];
        [alert show];
        [alert release];
    }
}

首先,创建MFMailComposeViewController,称之为mailer。然后设置mailer的mailComposeDelegate为self。邮件的主题设置为”A Message from MobileTuts+”, toRecipients的类型是NSArray,因此能够加入多个收件人。我增加了两个伪邮件地址,当然你可以加入任意你想要的邮件地址。这之后,我们把一张图片保存成NSData对象,这是因为我们能够直接地发送UIImage,把NSData对象作为附件添加到邮件中。设置类型为png图片,文件名为”mobiletutsImage”。这意味着,当接受者保存图片时,将会保存成mobiletutsImage。最后一件事是在mailer对象释放前显示mailer。

##第七步 检查结果并释放视图
你需要手动的释放邮件界面在代理方法调用中,在openMail:动作中增加如下方法:

- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error 
{   
    switch (result)
    {
        case MFMailComposeResultCancelled:
            NSLog(@"Mail cancelled: you cancelled the operation and no email message was queued.");
            break;
        case MFMailComposeResultSaved:
            NSLog(@"Mail saved: you saved the email message in the drafts folder.");
            break;
        case MFMailComposeResultSent:
            NSLog(@"Mail send: the email message is queued in the outbox. It is ready to send.");
            break;
        case MFMailComposeResultFailed:
            NSLog(@"Mail failed: the email message was not saved or queued, possibly due to an error.");
            break;
        default:
            NSLog(@"Mail not sent.");
            break;
    }

    // Remove the mail view
    [self dismissModalViewControllerAnimated:YES];
}

在delegate方法中,我们通过switch语句检查发送邮件的结果,然后以动画的形式释放视图控制器。在上述代码中,只是用NSLog记录了结果,但是关键点是你能够对用户的动作做出反应。

##附加 使它能够在iPad下工作
在iPad上,邮件界面以页面形式呈现,看起来非常的漂亮。在[self presentModalViewController:mailer animated:YES];增加如下代码,能够做到这点。

mailer.modalPresentationStyle = UIModalPresentationPageSheet;

5

##Wrap Up
希望你喜欢这篇向导,如果你有疑问需要解答的,请在下面留言。

翻译自:iOS SDK: Send E-mail In-App. 版权所有, 转载请著明出处,保留链接。