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

从iOS应用程序截图-模拟显示记录器(查询内部),ios,jailbreak,iphone-privateapi,ios6,Ios,Jailbreak,Iphone Privateapi,Ios6,我需要创建一个iOS应用程序,作为实验的一部分,它可以拍摄其他应用程序、视频等的屏幕截图。我愿意使用私有API,因为我不会将应用发布到应用商店。我可以成功地使用GetUIScreenImage()方法拍摄当前屏幕(应用程序屏幕)的快照 但是,由于沙盒限制,我无法在后台截图。我得到一个错误——“当应用程序处于后台时,无法调用CreateUIScreenImage() 我参考了这篇文章,它建议使用IOMobileFramebuffer和IOSurface绕过沙箱限制,也就是这个链接。但我无法获得创建

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

但是,由于沙盒限制,我无法在后台截图。我得到一个错误——“当应用程序处于后台时,无法调用CreateUIScreenImage()

我参考了这篇文章,它建议使用IOMobileFramebuffer和IOSurface绕过沙箱限制,也就是这个链接。但我无法获得创建和传输曲面的流程。非常感谢您对本主题的任何帮助

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

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

编辑
以下是我的理解-连接到主显示层的主屏幕表面需要放在当前层上。这样做之后,我应该能够浏览其他应用程序,从刚刚粘贴的表面打开它们

下面是代码(它将主屏幕表面置于应用层之上,但我无法使用该表面,即打开应用程序等):

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

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

获取创建和传输曲面的流程到底有什么问题?你能发布正在使用的代码并指出哪一行不起作用吗

对于越狱设备:

转到/Application/XCode/Content/Developer/Platforms,并在其中添加一句话“应用程序处于后台时无法调用CreateUIScreenImage()”。您将在某个框架中找到它(我假定为UIKit)。下一步,你可以分解它,你会发现一些权利,这是需要做的背景截图

您可以在这里了解如何使用ldid为越狱设备提供的权利:

谢谢你,维克多。我已经输入了密码。我也会尝试另一种方法。你能解释一下答案的第二部分吗?下一步,你可以分解它,你会发现一些在后台截图所需的权利。一些API有访问控制。所以特权应用程序(例如Springboard可以称之为特权应用程序)和非特权应用程序不能。这些特权称为iOS的权利。某个地方有一个代码,用于检查调用方的权限,如果没有权限,则返回错误。因此,如果您找到字符串,分解该框架并查看它的使用位置,您将发现非常接近该字符串的用法的是检查适当的权限。
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];