Делать скриншоты из iOS-приложения - эмулировать дисплей-рекордер (запрос по внутренним компонентам)

Мне нужно создать приложение для iOS, которое может делать скриншоты других приложений, видео и т. Д. В рамках эксперимента. Я открыт для использования Private API, так как я не буду публиковать приложение в магазине приложений. Я мог бы успешно использовать метод GetUIScreenImage(), чтобы сделать снимки текущего экрана (экран приложения).

Однако из-за ограничений в песочнице я не могу делать скриншоты в фоновом режиме. Я получаю сообщение об ошибке - "Невозможно вызвать CreateUIScreenImage(), пока приложение находится в фоновом режиме".

Я ссылался на эту статью - Как приложение iOS Display Recorder записывает экран без использования частного 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. Что звучит правильнее -> Приложение переходит на задний план. Получает самую верхнюю поверхность на экране, создает из нее изображение и сохраняет его. Просьба уточнить.

1 ответ

Что именно является проблемой с "получить поток создания и передачи поверхности"? Можете ли вы опубликовать код, который используете, и указать, какая строка не работает.

Для взломанных устройств:

Перейдите в /Application/XCode/Content/Developer/Platforms и найдите его в предложении "Невозможно вызвать CreateUIScreenImage(), пока приложение находится в фоновом режиме". Вы найдете это в некоторых рамках (я полагаю, UIKit). Затем вы можете разобрать его и найти некоторые права, которые необходимы для создания снимков экрана в фоновом режиме.

И вы можете посмотреть здесь, как использовать права с ldid для взломанного устройства: iOS Как использовать Entitlement.plist, чтобы указать свойство моего приложения

Другие вопросы по тегам