I want to attach an image to a MMS, on iOS7. I wrote following code:
MFMessageComposeViewController *messageController = [[MFMessageComposeViewController alloc] init];
messageController.messageComposeDelegate = self;
NSData *imgData = [NSData dataWithContentsOfFile:@"blablabla"];
BOOL didAttachImage = [messageController addAttachmentData:imgData typeIdentifier:@"public.data" filename:@"image"];
if (didAttachImage)
{
// Present message view controller on screen
[self presentViewController:messageController animated:YES completion:nil];
}
else
{
UIAlertView *warningAlert = [[UIAlertView alloc] initWithTitle:@"Error"
message:@"Failed to attach image"
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[warningAlert show];
return;
}
The problem is that when the SMS screen is presented, it doesn't recognize the image, and cannot send it. I see something like this:
I believe this has something to do either with imgData I am sending, or with typeIdentifier.
Note: I tried almost all possible typeIdentifiers: @"public.data", @"public.image", @"public.item", ... etc. None worked.
Can anybody please help me? What is the typeIdentifier you are using? I am testing on iPhone 5, iOS 7.0.2.
Thanks.
SOLUTION:
As Greg instructed, this solved my problem: set filename as @"image.png", and typeIdentifier to kUTTypePNG.
[messageController addAttachmentData:imgData typeIdentifier:(NSString *)kUTTypePNG filename:@"image.png"];
Thanks Greg.
The MFMessageComposeViewController wants the attachment to have the correct extension for the type of image you're uploading. I verified by testing with a PNG file, and the following variations of adding the attachment data:
[messageController addAttachmentData:imgData typeIdentifier:@"public.data" filename:@"image"]; [messageController addAttachmentData:imgData typeIdentifier:@"public.data" filename:@"image.abc"]; [messageController addAttachmentData:imgData typeIdentifier:@"public.data" filename:@"image.png"];
Only the last option worked. I didn't need to change the typeIdentifier, although it probably would make sense to choose a UTI that matches the type of data.
The full list of UTIs is available here: System-Declared Uniform Type Identifiers (Thanks @iWasRobbed!)
For Swift You can try this
if (MFMessageComposeViewController.canSendText()) { let controller = MFMessageComposeViewController() controller.body = "Solution for broken image in composer" controller.messageComposeDelegate = self if image.imageAsset != nil { let imageData = UIImageJPEGRepresentation(self.fixOrientation(img: image), 1) //! as NSData controller.addAttachmentData(imageData! , typeIdentifier: "image/.jpeg", filename: "image.jpeg") } viewController.present(controller, animated: true,completion: { }) }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With