Ich möchte einen Screenshot von einem Hintergrunddienst erfassen. Private API ist in Ordnung, da ich nicht im App Store einreichen muss. Ich habe bereits versucht UIGetScreenImage und es funktioniert nicht von Hintergrund App.IOSurface - IOS Private API - Screenshot im Hintergrund erfassen
Ich benutze folgenden Code, den ich von SO bekommen habe. IOSurfaceCreate gibt für mich null zurück. Jede Hilfe wird geschätzt.
CFMutableDictionaryRef dict;
IOSurfaceRef screenSurface = NULL;
char pixelFormat[4] = {'A','R','G','B'};
dict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
uint32_t width ;
uint32_t height;
void *pitch;
void *bPE;
void *size;
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);
uint32_t aseed;
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];
UIImageWriteToSavedPhotosAlbum(image, self_object, nil, nil);
CGImageRelease(cgImage);
CFRelease(destSurf);
Haben Sie das auf iOS 7 funktioniert? Ich erhalte einen Linker-Fehler bei IOMobileFramebufferOpen. Könnten Sie bitte teilen, welche Frameworks/Lib genau verlinken und wo Sie die Header haben? – Frank
mit dem Hinzufügen dieses Terminals Cmd, um Fehler zu löschen kommen von iOSurface > CD/Anwendungen/Xcode.app/Inhalte/Entwickler/Plattformen/iPhoneOS.platform/Entwickler/SDKs/iPhoneOS7.0.sdk/System/Library/Frameworks/IOKit. Framework > sudo ln -s Versionen/A/IOKit – HDNZ
Hat jemand ein funktionierendes Demo-Projekt für iOS 8? Oder können Sie mir sagen, wie Sie dieses Framework verwenden/die Header bekommen? – Max