How to send an email with cocos2d
We will use MFMailComposeViewController, and we want to send a email with preformated subject and body, and an image as attachment:
First, add the MFMailComposeViewControllerDelegate to your .h, this delegate method will be called when you have finish using the controller (after cancelling or sending the email):
-(void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error
Here is the code, basically we pause the cocos2d animation, prepare the controller with the subject/body and a screenshot file which is previously saved to the document directory (see the previous blog post on how to take a screenshot for more details).
-(void)sendEmail { AppController *app = (AppController*) [[UIApplication sharedApplication] delegate]; [[CCDirector sharedDirector] pause]; [[CCDirector sharedDirector] stopAnimation]; MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init]; if (!picker) //happens if no email is configured on your device { [[CCDirector sharedDirector] resume]; [[CCDirector sharedDirector] startAnimation]; return; } picker.mailComposeDelegate = self; [picker setSubject:@"This is test subject"]; [picker setMessageBody:@"This is test message body" isHTML:YES]; //take screenshot NSString *file = @"screenShot.png"; [CCDirector sharedDirector].nextDeltaTimeZero = YES; CGSize windowSize = [CCDirector sharedDirector].winSize; CCRenderTexture *renderTexture = [CCRenderTexture renderTextureWithWidth:windowSize.width height:windowSize.height]; [renderTexture begin]; [self visit]; [renderTexture end]; [renderTexture saveToFile:file format:kCCImageFormatPNG]; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *screenShotPath = [documentsDirectory stringByAppendingPathComponent:file]; NSData *data = [NSData dataWithContentsOfFile:screenShotPath]; UIImage *image = [UIImage imageWithData:data]; UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil); [picker addAttachmentData:data mimeType:@"image/png" fileName:@"attachment.png"]; [[app navController] presentModalViewController:picker animated:YES]; } -(void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error { [[CCDirector sharedDirector] resume]; [[CCDirector sharedDirector] startAnimation]; [controller dismissModalViewControllerAnimated:NO]; }
I have spent literally HOURS trying to figure this out from dozens of websites all across raywenderlich and stack overflow. This example worked easily and immediately
All I had to do:
Paste the “-(void)mailComposeController:(” bit in my HelloWorld.h file right above the @end
Paste the rest into HelloWorld.m
Call the function [self sendEmail];
BOOM, beautiful.
I’m using a standard Cocos2d project, no view controllers, and the default “@interface HelloWorldLayer : CCLayer ” from a brand new project.
One thing though: I previously added MessageUI.framework from project>Targets>Summary>Linked Frameworks and Libraries. I didn’t see this mentioned in your setup guide.
If anyone is getting a “Parse Issue; Expected a Type” error off the “MFMailComposeViewController” line in the .h file, include the framework from “MessageUI.framework” in your Target>Summary>Linked Frameworks by hitting the plus button and stick a “#import ” at the top of your .h file
Sorry it didn’t like my tags; The framework is added with #include [MessageUI/MessageUI.h], except replace the [] with the GreaterThan LessThan symbols as in an HTML tag
thanks Steven, indeed you need the messageui.framework …