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

// 意见反馈 检测是否安装邮箱
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];
}