Получить скриншот, пока приложение в фоновом режиме? (Частные API разрешены)

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

Теперь моя проблема в том, что мне нужно получить скриншот iPad в виде изображения программно. Я знаю метод UIGetScreenImage, а также рендеринг каждого вида на экране, чтобы получить изображение. Однако UIGetScreenImage нельзя вызвать из фона. (Я получаю сообщение об ошибке, когда пытаюсь сделать это из фона). И я не могу отобразить представления из другого приложения, так как знаю только представления своего приложения.

ВАРИАНТ 1 Я могу смоделировать нажатие кнопки "Домой" и клавиши блокировки, чтобы iPad мог создать снимок экрана. После этого я использую частные API для доступа к этому изображению из фотоальбома, используя [PLPhotoLibrary](https://github.com/nst/iOS-Runtime-Headers/blob/3686717e107fa36a990fac20c30da2da9a25b698/PrivateFrameworks/Photowork/hotobookPhoto.Ph)., PLPhotoAlbum и PLPhoto.

id lib = [PLPhotoLibrary sharedPhotoLibrary];
id allPhotosAlbum = [lib allPhotosAlbum];
id contents = [lib albumContents];
id lastPhoto = [contents objectAtIndex:[contents count] -1];
UIImage *screenshot = [lastPhoto newFullSizeImage];

Единственная проблема с этим подходом состоит в том, что скриншоты будут складываться в альбом, заполняя память iPad. Так что либо мне нужен другой способ, либо мне нужен способ удалить эти картинки. Но когда я вызываю методы удаления в фотоальбоме и библиотеке фотографий, я получаю сообщение "Ошибка SQLITE 8 [попытка записи в базу данных только для чтения]"

Буду признателен за любые предложения о том, как добиться этого снимка экрана лучше.

Я не буду загружать это приложение в магазин приложений. Это для частного использования.

4 ответа

Решение

После масштабных испытаний и попыток я пришел к выводу, что даже с частными API-интерфейсами удаление фотографий из фотоальбома является слишком большой проблемой, возможно, даже невозможным. В итоге я написал скрипт, который имитирует пользовательский ввод и стирает фотографии.

Раньше вы могли делать снимок экрана всего экрана устройства, с переднего плана или фона, используя IOSurface. Apple заблокировала этот API в iOS 9. Это больше невозможно без взлома вашего устройства, частного API или без джейла.

Вы можете использовать следующий закрытый API: [[UIWindow class] executeSelector:@selector(createScreenIOSurface)];

Джейлбрейк вашего устройства, вероятно, единственный выход, не то, чтобы я рекомендовал это делать.

Однако Apple никогда не предназначала людям, разработчикам или нет, использовать свои iPad так, как вы описали.

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