gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 05:45:52 25 4
gpt4 key购买 nike

我需要创建一个 iOS 应用程序,作为实验的一部分,它可以截取其他应用程序、视频等的屏幕截图。我愿意使用私有(private) 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() ?

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

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

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

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. 哪个听起来更正确 -> 应用程序移至后台。获取屏幕上最顶层的表面,从中创建图像并保存。请澄清。

最佳答案

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

对于越狱设备:

转到/Application/XCode/Content/Developer/Platforms 并为句子“无法在应用程序处于后台时调用 CreateUIScreenImage()”搜索它。你会在一些框架中找到它(我假设是 UIKit)。接下来,你可以反汇编它,你会发现一些在后台做截图所需要的权利。

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

关于ios - 从 iOS 应用程序截屏 - 模拟显示记录器(内部查询),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13833816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com