如何在越狱iOS设备上截屏整个屏幕?

我需要把包括状态栏在内的整个屏幕截图,我使用CARenderServerRenderDisplay来实现这一点,它适用于iPad,但在iPhone 6 Plus错误。 作为代码中的*标记部分,如果我设置width=screenSize.width*scaleheight=screenSize.height*scale ,则会导致崩溃,如果我只是将其更改为: width=screenSize.height*scaleheight=screenSize.width*scale ,它会起作用,但会产生一个像这样的图像: 在这里输入图像说明 ,我已经尝试了很多,但没有find理由,有没有人知道? 我希望我已经说清楚了。

 - (void)snapshot { CGFloat scale = [UIScreen mainScreen].scale; CGSize screenSize = [UIScreen mainScreen].bounds.size; //*********** the place where problem appears size_t width = screenSize.height * scale; size_t height = screenSize.width * scale; //*********** size_t bytesPerElement = 4; OSType pixelFormat = 'ARGB'; size_t bytesPerRow = bytesPerElement * width; size_t surfaceAllocSize = bytesPerRow * height; NSDictionary *properties = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], kIOSurfaceIsGlobal, [NSNumber numberWithUnsignedLong:bytesPerElement], kIOSurfaceBytesPerElement, [NSNumber numberWithUnsignedLong:bytesPerRow], kIOSurfaceBytesPerRow, [NSNumber numberWithUnsignedLong:width], kIOSurfaceWidth, [NSNumber numberWithUnsignedLong:height], kIOSurfaceHeight, [NSNumber numberWithUnsignedInt:pixelFormat], kIOSurfacePixelFormat, [NSNumber numberWithUnsignedLong:surfaceAllocSize], kIOSurfaceAllocSize, nil]; IOSurfaceRef destSurf = IOSurfaceCreate((__bridge CFDictionaryRef)(properties)); IOSurfaceLock(destSurf, 0, NULL); CARenderServerRenderDisplay(0, CFSTR("LCD"), destSurf, 0, 0); IOSurfaceUnlock(destSurf, 0, NULL); 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, nil, nil, nil); } 

如果你在一个Jailbroken环境中,你可以使用私有的UIImage方法_UICreateScreenUIImage

 OBJC_EXTERN UIImage *_UICreateScreenUIImage(void); // ... - (void)takeScreenshot { UIImage *screenImage = _UICreateScreenUIImage(); // do something with your screenshot } 

此方法使用CARenderServerRenderDisplay来更快地呈现整个设备屏幕。 它取代了在iOS 7 SDK的arm64版本中删除的UICreateScreenImageUIGetScreenImage方法。