欢迎回来!在此系列的第一部分中我展示了在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获得:
- 打开终端,切换到你想要存储代码的目录
- 输入git clone git://github.com/dcgrigsby/InAppEmail.git克隆软件仓库
对此repository我已经进行了两次单独的提交 — 第一次提交不包括程序内email,第二次的则包括此功能。 如果你打算逐步跟随我的教程,你可以从第一次提交开始。在源代码目录:
- 输入git checkout 0019071d855e6d3a9f263b8a02d9c7d93dc5dcd2
目标
InAppEmail是尽可能简单的一个应用程序。单个 “Send Email”按钮 — 暂时被禁止 — 当按下时触发 buttonPressed。
添加MessageUI Framework
作为MessageUI Framework的一部分, Apple提供了一个预先做好的compose-a-message UI叫做MFMailComposeViewController。为使用它,我们必须将MessageUI Framework加入我们的项目:
- 在项目的 Groups & Files 面板上展开InAppEmail项目
- Control-点击或右击Frameworks 文件夹
- 选择 Add > Existing Frameworks…
- 展开Frameworks文件夹
- 选择MessageUI.framework 并按Add
- 再按一次Add
然后,在头文件中引入framework
- 加入#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协议提供了一个回调机制帮助我们完成此任务。
要接收回调,我们需要:
- InAppEmailViewController遵循协议
- 将自身设定为接收回调的代理
- 实现回调方法
更新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邮件 – 一旦你掌握了基本概念, 所有这些都很简单。
最后,值得注意的一个限制:你不能强迫用户发送邮件,他们应该有权选择按取消键。




