ios - para - grabar pantalla iphone con sonido
Tomar capturas de pantalla de la aplicaciĆ³n iOS-emulando el grabador de pantalla(consulta en el interior) (1)
Necesito crear una aplicación iOS que pueda tomar capturas de pantalla de otras aplicaciones, videos, etc. como parte de un experimento. Estoy abierto a usar API privadas ya que no publicaré la aplicación en la tienda de aplicaciones. Pude utilizar con éxito el método GetUIScreenImage () para tomar instantáneas de la pantalla actual (pantalla de la aplicación).
Sin embargo, debido a las restricciones de la zona de pruebas, no puedo tomar capturas de pantalla mientras esté en segundo plano. Me sale el error: "No se puede llamar CreateUIScreenImage () mientras la aplicación está en segundo plano".
Me referí a este artículo: ¿Cómo registra la Grabadora de la aplicación iOS la pantalla sin usar una API privada? que sugirió el uso de IOMobileFramebuffer y IOSurface para eludir las restricciones de sandbox, también este enlace - http://www.iphonesheep.com/2009/11/25/iphone%E2%80%99s-framebuffer-secrets-revealed/ . Pero no puedo obtener el flujo de creación y transferencia de superficies. Cualquier ayuda sobre este tema es muy apreciada.
Además, ¿hay alguna manera de llamar a UIGetScreenImage () en segundo plano en un dispositivo con jailbreak?
Actualizar:
Puedo obtener la superficie de la pantalla principal y ponerla en la capa de la aplicación, pero mi caso de uso es poder abrir otras aplicaciones y poder grabarlas a través de la aplicación que creo. La superficie que pego sobre la capa de mi aplicación es estática.
editar
Esto es lo que entiendo: la superficie de la pantalla principal unida a la capa de visualización principal debe colocarse en la capa actual. Después de hacerlo, debería poder navegar a través de otras aplicaciones, abrirlas desde la superficie que acaba de pegar.
Aquí está el código (Coloca la superficie de la pantalla principal encima de la capa de la aplicación, pero no puedo usar esa superficie, es decir, abrir aplicaciones, etc.):
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];
Sé que me estoy perdiendo algo y estoy haciendo algo mal. Sería de gran ayuda si pudieras señalarlo.
actualizar
Creo que puedo estar equivocado en mi supuesto fundamental.
1. Lo que supongo -> La aplicación cambia las superficies (o capas) para que el usuario pueda navegar en la pantalla principal. La aplicación nunca se mueve al fondo.
2. Lo que suena más correcto -> La aplicación se mueve al fondo. Obtiene la superficie superior en la pantalla, crea una imagen y la guarda. Por favor aclara
¿Cuál es exactamente el problema con "obtener el flujo de creación y transferencia de superficie"? ¿Puede publicar el código que está utilizando y señalar qué línea no funciona?
Para los dispositivos jailbreak:
Vaya a / Application / XCode / Content / Developer / Platforms y grep it para la frase "No se puede llamar a CreateUIScreenImage () mientras la aplicación está en segundo plano". Lo encontrarás en algún marco (supongo que UIKit). A continuación, puede desmontarlo y encontrará algún derecho que se requiere para hacer capturas de pantalla en segundo plano.
Y puede ver aquí cómo usar las autorizaciones con ldid para dispositivo liberado: iOS Cómo usar Entitlement.plist para especificar la propiedad de mi aplicación