Xcode:使用选择器添加附件到电子邮件

时间:2015-11-17 02:19:49

标签: ios uiimagepickercontroller email-attachments

我开发了一款应用,允许用户从照片库中选择一个视频,然后将其作为附件发送到电子邮件中。我可以从图库中选择一个视频,然后继续发送电子邮件,但视频不会随电子邮件附上。控制台中没有错误。

ViewController.h:

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

@interface ViewController : UIViewController<UIImagePickerControllerDelegate, UINavigationControllerDelegate,MFMailComposeViewControllerDelegate>

@property (strong, nonatomic) IBOutlet UIImageView *imageView;
- (IBAction)choose:(id)sender;


@end

ViewController.m:

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
if (![UIImagePickerController  isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {

    UIAlertController *myAlertController = [UIAlertController  alertControllerWithTitle:@"MyTitle"
                                                                                message: @"MyMessage"
                                                                          preferredStyle:UIAlertControllerStyleAlert                   ];

    [self presentViewController:myAlertController animated:YES completion:nil];

}

}

- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

- (IBAction)choose:(id)sender {
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.allowsEditing = YES;
picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
picker.mediaTypes = [[NSArray alloc] initWithObjects:(NSString *)kUTTypeMovie,      nil];

[self presentViewController:picker animated:YES completion:NULL];
 }


 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {


UIImage *chosenImage = info[UIImagePickerControllerEditedImage];


[self performSelector:@selector(email:) withObject:chosenImage afterDelay:0.5];

[picker dismissViewControllerAnimated:YES completion:NULL];

}

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {

[picker dismissViewControllerAnimated:YES completion:NULL];

}

- (void)email:(UIImage *)choosenImage{
NSString *iOSVersion = [[UIDevice currentDevice] systemVersion];
NSString *model = [[UIDevice currentDevice] model];
NSString *version = @"1.0";
NSString *build = @"100";
MFMailComposeViewController *mailComposer = [[MFMailComposeViewController alloc] init];
mailComposer.mailComposeDelegate = self;
[mailComposer setToRecipients:[NSArray arrayWithObjects: @"support@myappworks.com",nil]];
[mailComposer setSubject:[NSString stringWithFormat: @"MailMe V%@ (build %@) Support",version,build]];
NSString *supportText = [NSString stringWithFormat:@"Device: %@\niOS Version:%@\n\n",model,iOSVersion];
supportText = [supportText stringByAppendingString: @"Please describe your problem or question."];
[mailComposer setMessageBody:supportText isHTML:NO];

NSData *data = UIImagePNGRepresentation(choosenImage);


[mailComposer addAttachmentData:data mimeType:@"image/png" fileName:@""];
[self presentViewController:mailComposer animated:YES completion:nil];

}

- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error
{
 [self dismissViewControllerAnimated:YES completion:nil];
}

@end

任何建议/帮助将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:1)

您提到您正在尝试附加视频,并且您已配置UIImagePickerController以将mediaTypes限制为仅限视频。那么问题是你要求编辑的图像&#34;在&#34; didFinishPickingMediaWithInfo&#34;方法:

UIImage *chosenImage = info[UIImagePickerControllerEditedImage];

用户没有选择图像 - 他们选择了一个视频。你需要改用它:

NSURL *chosenVideoUrl = info[UIImagePickerControllerMediaURL];
NSData *videoData = [NSData dataWithContentsOfURL:chosenVideoUrl];

然后,您可以将videoData传递给您的电子邮件方法并附加到电子邮件中。请务必更新&#34; image / png&#34;中的mimeType。到&#34;视频/ mp4&#34;,以及。

答案 1 :(得分:1)

如果您需要同时附加视频和图片,则必须为两者编写代码,但您只是为了附加图片而编写。您可以尝试下面的代码来获取两者

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {

    if ([[info objectForKey:UIImagePickerControllerMediaType] isEqual:(NSString *)kUTTypeMovie]) {
        NSString *videoURL = info[UIImagePickerControllerMediaURL];
        [self emailImage:nil orVideo:videoURL];
    }else {
        UIImage *chosenImage = info[UIImagePickerControllerEditedImage];
        [self emailImage:chosenImage orVideo:nil];
    }
    [picker dismissViewControllerAnimated:YES completion:NULL];
}

UIImagePickerControllerMediaURL将返回与UIImagePickerControllerEditedImage不同的文件网址,因此可以使用NSData方法dataWithContentsOfFile,如下所示。

if (choosenImage) {
    NSData *data = UIImagePNGRepresentation(choosenImage);
    NSString *filename = [NSString stringWithFormat:@"Image_%@.png",TimeStamp];
    [mailComposer addAttachmentData:data mimeType:@"image/png" fileName:filename];
    [self presentViewController:mailComposer animated:YES completion:nil];
}else {
    NSData *data = [NSData dataWithContentsOfFile:videoFile];
    NSString *filename = [NSString stringWithFormat:@"Video_%@.mp4",TimeStamp];
    [mailComposer addAttachmentData:data mimeType:@"video/mp4" fileName:filename];
    [self presentViewController:mailComposer animated:YES completion:nil];
}

如果您为附件提供文件名将会很有用,如果您希望可以使用TimeStamp。

#define TimeStamp [NSString stringWithFormat:@"%f",[[NSDate date] timeIntervalSince1970] * 1000]