从iOS应用程序截图 – 模拟显示logging(在内部查询)

我需要创build一个iOS应用程序,其中可以截取其他应用程序,video等作为实验的一部分。 我打开使用私人API的,因为我不会将应用程序发布到应用程序商店。 我可以成功地使用方法GetUIScreenImage()拍摄当前屏幕(应用程序屏幕)的快照。

但是,由于沙箱限制,我无法在后台截取屏幕截图。 我得到的错误 – “不能调用CreateUIScreenImage()而应用程序在后台”。

我提到了这篇文章 – iOS应用程序显示logging器如何在不使用私有API的情况下logging屏幕? 其中build议使用IOMobileFramebuffer和IOSurface来绕过沙盒限制,也可以使用这个链接 – http://www.iphonesheep.com/2009/11/25/iphone%E2%80%99s-framebuffer-secrets-revealed/ 。 但是我无法获得创build和转移表面的stream程。 任何有关这个话题的帮助,高度赞赏。

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

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

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

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

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.什么听起来更正确 – >应用程序移动到背景。 获取屏幕上最顶层的曲面,从中创build一个图像并保存。 请澄清。

“获得创造和转移表面的stream程”到底是什么问题? 你可以发布正在使用的代码,并指出哪一行不工作。

对于越狱设备:

转到/ Application / XCode / Content / Developer / Platforms,并为grep它的句子“不能调用CreateUIScreenImage(),而应用程序在后台”。 你会发现它在一些框架(我假设UIKit)。 接下来,您可以反汇编它,你会发现一些需要在后台做屏幕截图的权利。

你可以看看这里如何使用权限与ldid越狱设备: iOS如何使用Entitlement.plist指定我的应用程序的属性