菜鸟教程小白 发表于 2022-12-12 22:17:03

ios - 在 iOS 7 - 7.1.x 上截屏


                                            <p><p>主要问题,如何在 iOS 7+ 的背景下/在跳板时截屏?</p>

<p>我正在尝试开发一个应用程序来在后台录制 iOS 设备的屏幕。私有(private)或公共(public) API 的使用并不让我担心,只要这可能是可能的。我已经做了一些研究,以便在带有编程的 iOS 设备上拍摄屏幕截图。我发现的第一个“解决方案”要么已弃用,要么无法截取当前事件屏幕,只能截取应用内可查看的内容(无状态栏、通知中心、通知或控制中心)。</p>

<p>我最终遇到了在 iOS 7.0 - 7.1.x 上使用 IOSurface 的唯一可行方法。根据我的研究,如果您安装了 10.6 Xcode iOS 4 SDK,IOSurface 是 OSX 10.6 中公开可用的框架。 (/System/Library/Frameworks/IOSurface.framework/Headers/IOSurfaceAPI.h) </p>

<p>这里有几个关于 Stack Overflow 的问题以及解释这些用户让 IOSurface 工作的原因:</p>

<p> <a href="https://stackoverflow.com/questions/21656959/using-iosurface-to-take-screenshot-in-ios7-in-games" rel="noreferrer noopener nofollow">Using IOSurface to take screenshot in iOS7 in games</a> - 用户表示他对截图没有问题,只是看游戏。</p>

<p> <a href="https://stackoverflow.com/questions/21629468/how-to-take-screenshot-for-the-entire-screen-no-matter-which-app-is-at-front-mos?lq=1" rel="noreferrer noopener nofollow">How to take screenshot for the entire screen no matter which app is at front most in iOS 7(Jailbroken)</a>该用户想用这种方法在越狱设备上截屏,响应的用户使用IOSurface成功,没有越狱。</p>

<p> <a href="https://stackoverflow.com/a/16505514/3139899" rel="noreferrer noopener nofollow">https://stackoverflow.com/a/16505514/3139899</a>用户 myCodeHurts 也取得了成功,所有代码都非常相似。</p>

<p>上面所有的用户似乎都成功了,甚至没有一个人提到需要 IOSurface.framework。</p>

<p>我当前的代码:</p>

<pre><code>-(void)SavePhoto
{
IOMobileFramebufferConnection connect;
kern_return_t result;
IOSurfaceRef screenSurface = NULL;

io_service_t framebufferService = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching(&#34;AppleH1CLCD&#34;));
if(!framebufferService)
    framebufferService = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching(&#34;AppleM2CLCD&#34;));
if(!framebufferService)
    framebufferService = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching(&#34;AppleCLCD&#34;));

result = IOMobileFramebufferOpen(framebufferService, mach_task_self(), 0, &amp;connect);

result = IOMobileFramebufferGetLayerDefaultSurface(connect, 0, &amp;screenSurface);

uint32_t aseed;
IOSurfaceLock(screenSurface, kIOSurfaceLockReadOnly, &amp;aseed);
uint32_t width = IOSurfaceGetWidth(screenSurface);
uint32_t height = IOSurfaceGetHeight(screenSurface);
//int m_width = 320;
//int m_height = 480;
CFMutableDictionaryRef dict;
int pitch = width*4, size = width*height*4;
int bPE=4;
char pixelFormat = {&#39;A&#39;,&#39;R&#39;,&#39;G&#39;,&#39;B&#39;};
dict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &amp;kCFTypeDictionaryKeyCallBacks, &amp;kCFTypeDictionaryValueCallBacks);
CFDictionarySetValue(dict, kIOSurfaceIsGlobal, kCFBooleanTrue);
CFDictionarySetValue(dict, kIOSurfaceBytesPerRow, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &amp;pitch));
CFDictionarySetValue(dict, kIOSurfaceBytesPerElement, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &amp;bPE));
CFDictionarySetValue(dict, kIOSurfaceWidth, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &amp;width));
CFDictionarySetValue(dict, kIOSurfaceHeight, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &amp;height));
CFDictionarySetValue(dict, kIOSurfacePixelFormat, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, pixelFormat));
CFDictionarySetValue(dict, kIOSurfaceAllocSize, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &amp;size));

IOSurfaceRef destSurf = IOSurfaceCreate(dict);

void* outAcc;
IOSurfaceAcceleratorCreate(NULL, 0, &amp;outAcc);

IOSurfaceAcceleratorTransferSurface(outAcc, screenSurface, destSurf, dict, NULL);

IOSurfaceUnlock(screenSurface, kIOSurfaceLockReadOnly, &amp;aseed);
CFRelease(outAcc);

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 *img = ;
UIImageWriteToSavedPhotosAlbum(img, self, nil, nil);

// MOST RELEVANT PART OF CODE

//CVPixelBufferCreateWithBytes(NULL, width, height, kCVPixelFormatType_32BGRA, IOSurfaceGetBaseAddress(destSurf), IOSurfaceGetBytesPerRow(destSurf), NULL, NULL, NULL, &amp;sampleBuffer);
}
</code></pre>

<p>这取自 <a href="https://stackoverflow.com/a/16505514/3139899" rel="noreferrer noopener nofollow">myCodeHurts&#39;</a>另一个问题的答案。</p>

<p>我尝试过使用或不使用官方版本的 IOSurface,以及我在互联网上找到的其他一些链接,在 Xcode 中构建时,如果不是非常相似,它们都会返回相同的错误:</p>

<p> <a href="http://pastie.org/9176533" rel="noreferrer noopener nofollow">http://pastie.org/9176533</a> (这里太长了,放不下)</p>

<p>显然,我收到的主要是关于 API 不适用于 iOS 的错误,但让我感到困惑的是其他人如何能够成功地使用 IOSurface 在 iOS 7+ 上捕获屏幕截图。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>这实际上是 IOSurfaceBase.h 文件的错误,而不是 IOSurfaceAPI.h 文件。也可能是您在 IOSurface 框架中没有 IOSurfaceBase.h 文件。您必须确保在 IOSurfaceBase.h 文件中声明了 <code>#define IOSFC_AVAILABLE_STARTING(_mac,_iphone)</code>。或者,如果您使用 theosheader ,<a href="https://github.com/rpetrich/iphoneheaders" rel="noreferrer noopener nofollow">https://github.com/rpetrich/iphoneheaders</a> ,这应该已经在 IOSurface.h 中声明了,然后您所要做的就是将 IOSurfaceAPI.h 文件从您的 Mac OS X 系统复制到其他 IOSurface 头文件,然后通过转到您的 SDK 文件夹将其添加到您的项目中,然后是 PrivateFrameworks,然后是 IOSurface.framework。在其中创建一个新文件夹并将其命名为“Headers”。将所有 IOSurface 文件复制到新创建的 headers 文件夹中,然后就可以清除您的错误了!</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 在 iOS 7 - 7.1.x 上截屏,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/23666502/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/23666502/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 在 iOS 7 - 7.1.x 上截屏