从iOS应用程序中截取屏幕截图 - 模拟显示记录器(在内部查询)

时间:2012-12-12 06:07:12

标签: ios jailbreak iphone-privateapi ios6

我需要创建一个iOS应用程序,它可以截取其他应用程序,视频等作为实验的一部分。我愿意使用私有API,因为我不会将应用程序发布到应用程序商店。我可以成功使用方法GetUIScreenImage()来拍摄当前屏幕(应用程序屏幕)的快照。

但是,由于沙箱限制,我无法在后台拍摄屏幕截图。我收到错误 - “当应用程序处于后台时,无法调用CreateUIScreenImage()”。

我提到了这篇文章 - How does the iOS app Display Recorder record the screen without using private API?建议使用IOMobileFramebuffer和IOSurface来绕过沙箱限制,也就是这个链接 - http://www.iphonesheep.com/2009/11/25/iphone%E2%80%99s-framebuffer-secrets-revealed/。但我无法获得创建和传输曲面的流程。非常感谢您对此主题的任何帮助。

另外,有没有办法在越狱设备的后台调用UIGetScreenImage()?

更新
我能够抓住主屏幕表面并将其放在应用层上,但我的用例是能够打开其他应用程序并能够通过我创建的应用程序记录它们。然而,粘贴在我的应用层上的表面是静态的。

修改
这是我所理解的 - 连接到主显示层的主屏幕表面需要放在当前层上。完成后,我应该能够浏览其他应用程序,从刚刚粘贴的表面打开它们。

这是代码(它将主屏幕表面放在app层的顶部,但我无法使用该表面,即打开应用程序等。):

IOMobileFramebufferConnection connect;
kern_return_t result;
CoreSurfacebufferRef screenSurface = NULL;
io_service_t framebufferService = IOServiceGetMatchingService (kIOMasterPortDefault, IOServiceMatching ("AppleH1CLCD"));
if(!framebufferService)
        io_service_t framebufferService = IOServiceGetMatchingService (kIOMasterPortDefault, IOServiceMatching ("AppleM2CLCD"));
if(!framebufferService)
        io_service_t framebufferService = IOServiceGetMatchingService (kIOMasterPortDefault, IOServiceMatching ("AppleCLCD"));
result = IOMobileFramebufferOpen( framebufferService, mach_task_self(), 0 , &connect);
result = IOMobileFramebufferGetLayerDefaultSurface(connect, 0, &screenSurface);

CALayer *Layer;
Layer = [CALayer layer];
[Layer setFrame: CGRectMake(0, 0, 768, 1024)];
[Layer setOpaque:YES];
IOSurfaceLock(screenSurface, 0, NULL);
[Layer setContents: (_bridge id)(screenSurface)];
IOSurfaceUnlock(screenSurface, 0, NULL);
[self.view.layer addSublayer:Layer];

我知道我错过了什么,做错了什么。如果你可以指出这一点,那将是很有帮助的。

更新
我认为我的基本假设可能是错的。
1.我假设 - >应用程序交换曲面(或图层),以便用户现在可以在主屏幕上浏览。该应用程序永远不会移动到后台 2.听起来更正确 - >该应用程序移动到后台。获取屏幕上最顶部的表面,从中创建图像并保存。 请澄清。

1 个答案:

答案 0 :(得分:3)

&#34的问题是什么?获得创建和转移表面的流程"?你可以发布正在使用的代码,并指出哪条线不起作用。

对于越狱设备:

转到/ Application / XCode / Content / Developer / Platforms并使用grep查找句子"当应用程序处于后台时,无法调用CreateUIScreenImage()"。你会在某个框架中找到它(我假设是UIKit)。接下来,您可以反汇编它,您将找到在后台进行屏幕截图所需的一些权利。

你可以在这里看看如何使用ldid对越狱设备使用权利: iOS How to use Entitlement.plist to specify property of my app