iOS 使用系统邮箱实现个人 App 意见反馈功能

Posted by Calvin on 2017-04-14

当个人开发者在做意见反馈时,大多因为精力、能力等等限制使用系统的自带邮件进行手机用户反馈。现在总结一下使用系统邮箱采集用户反馈的方法。

// 意见反馈 检测是否安装邮箱
if ([MFMailComposeViewController canSendMail]) { // 用户已设置邮件账户
[self sendBySysMail];
}else{
setToast(@"未检测到您手机上的邮件客户端");
}

由于 iOS 10 系统用户可以自定义删除系统应用。所以,第一步先检测用户手机上是否还留有「邮件」App,如果存在则继续使用系统邮箱。如果不存在则做其它的操作,比如提示用户手动发邮件,或者检测手机本地是否还有其他的邮箱 App,有的话打开其他 App 进行反馈,都是很不错的用户体验。

当然我也遇到过很多用户反馈使用的是系统邮件的方法,但没有判断本地邮件是否存在,导致反馈不成功,用户体验很差。

第二步,使用系统邮件方法进行发邮件操作

- (void)sendBySysMail
{
// 邮件服务器
MFMailComposeViewController *mailCompose = [[MFMailComposeViewController alloc] init];
// 设置邮件代理
[mailCompose setMailComposeDelegate:self];
// 设置邮件主题
[mailCompose setSubject:@"邮件主题"];
// 设置收件人
[mailCompose setToRecipients:@[@"[email protected]"]];
// 设置抄送人
[mailCompose setCcRecipients:@[@"邮箱号码"]];
// 设置密抄送
[mailCompose setBccRecipients:@[@"邮箱号码"]];
/**
* 设置邮件的正文内容
*/
NSString *emailContent = @"我是邮件内容";
// 是否为HTML格式
[mailCompose setMessageBody:emailContent isHTML:NO];
// 如使用HTML格式,则为以下代码
[mailCompose setMessageBody:@"<html><body><p>Hello</p><p>World!</p></body></html>" isHTML:YES];
/**
* 添加附件
*/
UIImage *image = [UIImage imageNamed:@"image"];
NSData *imageData = UIImagePNGRepresentation(image);
[mailCompose addAttachmentData:imageData mimeType:@"" fileName:@"custom.png"];
NSString *file = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"pdf"];
NSData *pdf = [NSData dataWithContentsOfFile:file];
[mailCompose addAttachmentData:pdf mimeType:@"" fileName:@"7天精通iOS"];
// 弹出邮件发送视图
[self presentViewController:mailCompose animated:YES completion:nil];
}

实现 mail 代理方法

- (void)mailComposeController:(MFMailComposeViewController *)controller
didFinishWithResult:(MFMailComposeResult)result
error:(NSError *)error
{
switch (result)
{
case MFMailComposeResultCancelled: // 用户取消编辑
NSLog(@"Mail send canceled...");
break;
case MFMailComposeResultSaved: // 用户保存邮件
NSLog(@"Mail saved...");
break;
case MFMailComposeResultSent: // 用户点击发送
NSLog(@"Mail sent...");
break;
case MFMailComposeResultFailed: // 用户尝试保存或发送邮件失败
NSLog(@"Mail send errored: %@...", [error localizedDescription]);
break;
}
// 关闭邮件发送视图
[self dismissViewControllerAnimated:YES completion:nil];
}