通过电子邮件发送全屏iPhone应用程序

时间:2009-03-28 08:37:18

标签: iphone email screenshot

我正在开发一款iPhone应用程序,用于使用内置图形和用户定义文本创建图像。

我希望能够拥有我的应用程序,内置图形和用户定义的文本,然后可以将其作为单个图像(非常类似于屏幕截图)发送到要通过电子邮件发送的电子邮件应用程序。

有没有办法在不截取屏幕截图的情况下执行此操作,离开应用程序,进入照片应用程序,选择屏幕截图,然后从那里通过电子邮件发送?

最终,我希望能够在我的应用中设置一个用户可以点按的按钮,整个屏幕将被捕获并直接发送到邮件应用。

感激地接受任何指针!

6 个答案:

答案 0 :(得分:5)

为了扩展布伦特的答案,以下代码将获取截图并将其作为名为screenshot.png的PNG保存到Documents目录:

UIWindow *screenWindow = [[UIApplication sharedApplication] keyWindow];

UIGraphicsBeginImageContext(screenWindow.frame.size);
[screenWindow.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *screenshot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

NSData *screenshotPNG = UIImagePNGRepresentation(screenshot);

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];

NSError *error = nil;
[screenshotPNG writeToFile:[documentsDirectory stringByAppendingPathComponent:@"screenshot.png"] options:NSAtomicWrite error:&error];

这有点粗糙,因为它会在标题栏的屏幕顶部附近留下一个空白点,并且似乎没有从CAEAGLLayers获取内容。

另外,我不相信您可以使用标准的mailto:// URL构造,然后使用openURL来发送MIME编码的附件。也许3.0 SDK修复了这个,但我还没有玩它。您可能需要使用sksmtpmessage之类的内容直接从您的应用程序中发送消息。

答案 1 :(得分:4)

还有私有API UIGetScreenImage。它的用法如下:

CGImageRef UIGetScreenImage();
@interface UIImage (ScreenImage)
+ (UIImage *)imageWithScreenContents;
@end

@implementation UIImage (ScreenImage)
+ (UIImage *)imageWithScreenContents
{
    CGImageRef cgScreen = UIGetScreenImage();
    if (cgScreen) {
        UIImage *result = [UIImage imageWithCGImage:cgScreen];
        CGImageRelease(cgScreen);
        return result;
    }
    return nil;
}
@end

此功能可与UIImagePNGRepresentation结合使用以产生PNG。

答案 2 :(得分:3)

Apple是now allowing个应用程序使用;

CGImageRef UIGetScreenImage(void);

功能。虽然你必须记住它返回一个保留的CGImageRef,你必须相应地管理你的内存。

他们还说,“ ...未来的iPhone OS版本可能提供相当于此功能的公共API。此时,所有使用UIGetScreenImage()的应用程序都需要采用公共API。

答案 3 :(得分:1)

skpsmtpmessage很棒。事实上,它是如此的好,我去克隆它并在github上添加了示例项目。下面的示例GUI添加了一些铃声和口哨,如进度条和其他一些好东西,但它基本上维护核心skpsmtpmessage代码。

http://github.com/kailoa/iphone-smtp/tree/master

答案 4 :(得分:0)

我不知道这是否可行,但你可以尝试创建一个支持位图的图形上下文,然后获取根视图的核心动画层并调用它的-renderInContext:方法。那个可能做到了,但我从未尝试过。

但也许你应该考虑采用不同的方法。只是你已经编写了一堆在屏幕上可见的自定义绘图代码,并且你希望能够绘制到文件或内存缓冲区中吗?如果是这样,也许您应该将绘图代码从视图中分解出来,并放入视图简单使用的单独对象中。这样你就可以很容易地把它画成两种方式。

答案 5 :(得分:0)

在OS 3.0中,您可以使用MFMailComposeViewController:

MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
picker.mailComposeDelegate = self;
[picker addAttachmentData:screenshotPNG mimeType:@"image/png" fileName:@"PNGfromMyApp"];