Получить скриншот, пока приложение в фоновом режиме? (Частные 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 так, как вы описали.