subir movimiento hacer guardar fotos enviar convertir convert con compartir como ios ios5 ios4 iphone-privateapi

ios - movimiento - guardar live como gif iphone



Crear una imagen de la superficie ios y guardarla (2)

El código especificado funciona si lo ejecuta en segundo plano. Toma una captura de pantalla de la superficie más alta en la pantalla del dispositivo iOS.
El problema se debió al hecho de que, dentro de la aplicación, se tomaba una captura de pantalla de la vista en blanco creada para la aplicación.
Sin embargo, debe realizar capturas de pantalla a intervalos mínimos de 2 segundos, de lo contrario, el sistema operativo suspenderá su aplicación. Cualquier sugerencia sobre cómo mejorar eso será útil.


Intento adquirir la superficie asociada a la pantalla principal del dispositivo ios, crear una imagen y guardarla. Esto es relevante para esta pregunta: tomar capturas de pantalla de la aplicación iOS, emulando el grabador de pantalla (consulta en el interior) .
El código es el siguiente:

IOMobileFramebufferConnection connect; kern_return_t result; io_service_t framebufferService = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("AppleH1CLCD")); if(!framebufferService) framebufferService = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("AppleM2CLCD")); if(!framebufferService) framebufferService = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("AppleCLCD")); result = IOMobileFramebufferOpen(framebufferService, mach_task_self(), 0, &connect); result = IOMobileFramebufferGetLayerDefaultSurface(connect, 0, &screenSurface); uint32_t aseed; IOSurfaceLock(screenSurface, kIOSurfaceLockReadOnly, &aseed); uint32_t width = IOSurfaceGetWidth(screenSurface); uint32_t height = IOSurfaceGetHeight(screenSurface); CFMutableDictionaryRef dict; int pitch = width*4, size = 4*width*height; int bPE=4; char pixelFormat[4] = {''A'',''R'',''G'',''B''}; dict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); CFDictionarySetValue(dict, kIOSurfaceIsGlobal, kCFBooleanTrue); CFDictionarySetValue(dict, kIOSurfaceBytesPerRow, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &pitch)); CFDictionarySetValue(dict, kIOSurfaceBytesPerElement, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &bPE)); CFDictionarySetValue(dict, kIOSurfaceWidth, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &width)); CFDictionarySetValue(dict, kIOSurfaceHeight, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &height)); CFDictionarySetValue(dict, kIOSurfacePixelFormat, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, pixelFormat)); CFDictionarySetValue(dict, kIOSurfaceAllocSize, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &size)); IOSurfaceRef destSurf = IOSurfaceCreate(dict); IOSurfaceAcceleratorRef outAcc; IOSurfaceAcceleratorCreate(NULL, 0, &outAcc); CFDictionaryRef ed = (__bridge CFDictionaryRef)[NSDictionary dictionaryWithObjectsAndKeys: nil]; IOSurfaceAcceleratorTransferSurface(outAcc, screenSurface, destSurf, ed, NULL); IOSurfaceUnlock(screenSurface, kIOSurfaceLockReadOnly, &aseed); CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, IOSurfaceGetBaseAddress(destSurf), (width*height*4), NULL); CGImageRef cgImage=CGImageCreate(width, height, 8, 8*4, IOSurfaceGetBytesPerRow(destSurf), CGColorSpaceCreateDeviceRGB(), kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Little, provider, NULL, YES, kCGRenderingIntentDefault); UIImage *image = [UIImage imageWithCGImage: cgImage]; CGImageRelease(cgImage); UIImageWriteToSavedPhotosAlbum(image, self, nil, nil);


Pero todo lo que obtengo es una imagen en blanco guardada en la carpeta de mi foto. Por favor, ayuda en qué parte me estoy equivocando. Gracias.


Recuerdo que vi algo sobre este tema (tomando capturas de pantalla en el fondo) hace algún tiempo. No pude encontrar el lugar exacto y el código que vi. La única nota que dejé para mí fue el uso de createScreenIOSurface

Busqué en Google un poco y encontré algunas menciones:

Obtenga una captura de pantalla mientras la aplicación está en segundo plano? (API privadas permitidas)

https://github.com/rpetrich/FastBlurredNotificationCenter/blob/master/Tweak.x

http://pastie.org/pastes/3734430

Como recuerdo, el código era mucho más compacto que lo que mostrabas.