欢迎回来!在此系列的第一部分中我展示了在iPhone程序中iPhone 3.0新特性系列教程之一 – Shake to Undo/Redo

 

这次,我们将讲述怎样使用3.0新特性MessageUI framework在一个简单iPhone程序中发送email。

 

技术上看,无论是从程序发送邮件还是MessageUI都不是什么新东西。但在3.0之前,MessageUI是私有的framework,我们只能使用mailto:// URLs这种有限制的方式来进行邮件发送。

 

总而言之,在3.0下使用MessageUI发送信息是简单而又全功能的。

 

我们从一段可以工作的带有一个按钮UI的简单代码开始。我们将加入一些代码,当按钮按下时,“撰写email”信息UI及预先填好的主题和内容将被显示出来。

 

源代码/GitHub

 

本教程源代码可以从GitHub获得:

  1. 打开终端,切换到你想要存储代码的目录
  2. 输入git clone git://github.com/dcgrigsby/InAppEmail.git克隆软件仓库

 

对此repository我已经进行了两次单独的提交 — 第一次提交不包括程序内email,第二次的则包括此功能。 如果你打算逐步跟随我的教程,你可以从第一次提交开始。在源代码目录:

  1. 输入git checkout 0019071d855e6d3a9f263b8a02d9c7d93dc5dcd2

 

目标

 

InAppEmail是尽可能简单的一个应用程序。单个 “Send Email”按钮 — 暂时被禁止 — 当按下时触发 buttonPressed。

 

添加MessageUI Framework

 

作为MessageUI Framework的一部分, Apple提供了一个预先做好的compose-a-message UI叫做MFMailComposeViewController。为使用它,我们必须将MessageUI Framework加入我们的项目:

  1. 在项目的 Groups & Files 面板上展开InAppEmail项目
  2. Control-点击或右击Frameworks 文件夹
  3. 选择 Add > Existing Frameworks…
  4. 展开Frameworks文件夹
  5. 选择MessageUI.framework 并按Add
  6. 再按一次Add

 

然后,在头文件中引入framework

  1. 加入#import <MessageUI/MessageUI.h> 到InAppEmailViewController.h

 

显示 MFMailComposeViewController UI

 

MFMailComposeViewController与其他view controller一样; 我们可以在InAppEmailViewController 使用presentModalViewController使其滑入屏幕。

 

替换InAppEmailController.m中的buttonPressed方法:

1
2
3
4
5
6
7
- (IBAction)buttonPressed {    
    MFMailComposeViewController *controller = [[MFMailComposeViewController alloc] init];  
    [controller setSubject:@"In app email..."];    
    [controller setMessageBody:@"...a tutorial from mobileorchard.com" isHTML:NO];     
    [self presentModalViewController:controller animated:YES];     
    [controller release];  
}

 

如果你此时运行程序,你一定会失望。“Send Email” 按钮被禁止了。启用它是十分容易,但我们一定要在iPhone或iPod Touch程序已经运行并设置好发送邮件后,才能这样做。在InAppEmailViewController.m的viewDidLoad方法下加入代码:

1
2
3
4
- (void)viewDidLoad {  
    if ([MFMailComposeViewController canSendMail])
        button.enabled = YES;  
}

 

关闭MFMailComposeViewController UI

 

我们的任务差不多完成了。运行程序:按下按钮打开预填了示例信息的compose UI。在“To"处添上电邮地址然后运行。

 

我们还缺少一个部分:我们需要在什么时候关闭composer UI。 MFMailComposeViewControllerDelegate协议提供了一个回调机制帮助我们完成此任务。

 

要接收回调,我们需要:

  1. InAppEmailViewController遵循协议
  2. 将自身设定为接收回调的代理
  3. 实现回调方法

 

更新InAppEmailViewController.h以采用协议。修改如下:

1
2
3
4
5
6
7
8
9
#import <UIKit/UIKit.h>    

@interface InAppEmailViewController : UIViewController <MFMailComposeViewControllerDelegate>
{  
    IBOutlet UIButton *button;  
}

- (IBAction)buttonPressed;    
@end

 

为设定自身为接收回调的代理,更新InAppEmailViewController.m中buttonPressed方法。修改如下:

1
2
3
4
5
6
7
8
9
- (IBAction)buttonPressed
{  
    MFMailComposeViewController *controller = [[MFMailComposeViewController alloc] init];  
    controller.mailComposeDelegate = self;
    [controller setSubject:@"In app email..."];    
    [controller setMessageBody:@"...a tutorial from mobileorchard.com" isHTML:NO];     
    [self presentModalViewController:controller animated:YES];     
    [controller release];  
}

 

最后,实现回调方法。将mailComposeController:didFinishWithResult:error:方法加入InAppEmailViewController.m:

1
2
3
4
5
6
- (void)mailComposeController:(MFMailComposeViewController*)controller
       didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
{  
    [self becomeFirstResponder];   
    [self dismissModalViewControllerAnimated:YES];  
}

 

结论

 

基本上就是这样。本教程并没有涉及设定收件人或撰写HTML邮件 – 一旦你掌握了基本概念, 所有这些都很简单。

 

最后,值得注意的一个限制:你不能强迫用户发送邮件,他们应该有权选择按取消键。

 

 

原文见:New In iPhone 3.0 Tutorial Series, Part 2: In App Email, MessageUI  作者:Dan Grigsby