远程获取iOS设备的屏幕截图

前端之家收集整理的这篇文章主要介绍了远程获取iOS设备的屏幕截图前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

下面是编程之家 jb51.cc 通过网络收集整理的代码片段。

编程之家小编现在分享给大家,也给大家做个参考。

#import <QuartzCore/QuartzCore.h>
#import <sys/socket.h>
#import <netinet/in.h>
#import <arpa/inet.h>
#import <pthread.h>

CFSocketRef _socket;

void* serverThread(void* context);
int setupSocket(void);
void acceptCallBack(CFSocketRef socket,CFSocketCallBackType type,CFDataRef address,const void *data,void *info);
void sendScreenShots(CFWriteStreamRef oStream);

void sendScreenShots(CFWriteStreamRef oStream) {
    CGSize screenSize = [[UIScreen mainScreen] bounds].size;
    UIGraphicsBeginImageContextWithOptions(screenSize,YES,0);
    CGContextRef context = UIGraphicsGetCurrentContext();
    UIWindow * window = [[UIApplication sharedApplication] keyWindow];
    CGContextSaveGState(context);
    CGContextTranslateCTM(context,[window center].x,[window center].y);
    CGContextConcatCTM(context,[window transform]);
    CGContextTranslateCTM(context,-[window bounds].size.width*[[window layer] anchorPoint].x,-[window bounds].size.height*[[window layer] anchorPoint].y);
    [[window layer] renderInContext:context];
    CGContextRestoreGState(context);
    
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    
    NSData* imageData = UIImagePNGRepresentation(image);
    
    NSUInteger offset = 0;
    NSUInteger buff_size = 1024;
    while(imageData.length>offset){
        NSUInteger buff_len = imageData.length - offset > buff_size ? buff_size : imageData.length - offset;
        CFWriteStreamWrite(oStream,imageData.bytes+offset,buff_len);
        offset = offset + buff_len;
    }
    
    UIGraphicsEndImageContext();
}

void acceptCallBack(CFSocketRef socket,void *info) {
    if (kcfSocketAcceptCallBack == type) {
        CFSocketNativeHandle nativeSocketHandle = *(CFSocketNativeHandle *)data;
        uint8_t name[SOCK_MAXADDRLEN];
        socklen_t nameLen = sizeof(name);
        if (0 != getpeername(nativeSocketHandle,(struct sockaddr *)name,&nameLen)) {
            close(nativeSocketHandle);
        }
        
        //NSLog(@"%s connected.",inet_ntoa( ((struct sockaddr_in *)name)->sin_addr ));
        CFWriteStreamRef oStream;
        CFStreamCreatePairWithSocket(kcfAllocatorDefault,nativeSocketHandle,NULL,&oStream);
        if (oStream) {
            CFWriteStreamOpen(oStream);
            sendScreenShots(oStream);
            CFWriteStreamClose(oStream);
            close(nativeSocketHandle);
            
        } else {
            close(nativeSocketHandle);
        }
    }
}

int setupSocket() {
    _socket = CFSocketCreate(kcfAllocatorDefault,PF_INET,SOCK_STREAM,IPPROTO_TCP,kcfSocketAcceptCallBack,acceptCallBack,NULL);
    if (NULL == _socket) {
        return 0;
    }
    
    int optVal = 1;
    setsockopt(CFSocketGetNative(_socket),SOL_SOCKET,SO_REUSEADDR,(void *)&optVal,sizeof(optVal));
    
    struct sockaddr_in addr4;
    memset(&addr4,sizeof(addr4));
    addr4.sin_len = (__uint8_t)sizeof(addr4);
    addr4.sin_family = AF_INET;
    addr4.sin_port = htons(2115);
    addr4.sin_addr.s_addr = htonl(INADDR_ANY);
    CFDataRef address = CFDataCreate(kcfAllocatorDefault,(UInt8 *)&addr4,sizeof(addr4));
    
    if (kcfSocketSuccess != CFSocketSetAddress(_socket,address)) {
        if (_socket) CFRelease(_socket);
        _socket = NULL;
        return 0;
    }
    
    CFRunLoopRef cfRunLoop = CFRunLoopGetCurrent();
    CFRunLoopSourceRef source = CFSocketCreateRunLoopSource(kcfAllocatorDefault,_socket,0);
    CFRunLoopAddSource(cfRunLoop,source,kcfRunLoopCommonModes);
    CFRelease(source);
    
    return 1;
}

void* serverThread(void* context) {
    @autoreleasepool {
        int res = setupSocket();
        if (!res) {
            return 0;
        }
        CFRunLoopRun();
        return (void*)1;
    }
}

int startScreenServer() {
    pthread_t tid;
    return pthread_create(&tid,serverThread,NULL);
}

以上是编程之家(jb51.cc)为你收集整理的全部代码内容,希望文章能够帮你解决所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

原文链接:https://www.f2er.com/iOS/455347.html

猜你在找的iOS相关文章