2015-01-06 13 views
0

NSXPCConnection이있는 소켓을 사용할 때 문제가 발생합니다.NSXPCConnection과 함께 소켓 사용

기본적으로 NSXPCConnection을 통해 설정된 기본 프로세스와 실행중인 프로세스가 있습니다. 이 도우미 프로세스는 서버로 작동하고 외부 연결을 수신하는 특정 포트 (예 : 111)를 청취해야합니다.

도우미 프로세스는 Apple에서 제공하는 TCPServer 도우미 클래스 (래퍼 주위 CFSocket)를 사용하여 수신 소켓을 엽니 다. 코드는 여기에 있습니다 : https://code.google.com/p/iphone-remotepad/source/browse/trunk/RemotePad/TCPServer.h?r=238

- (BOOL)start:(NSError **)error에 소켓이 성공적으로 열렸습니다.

외부 클라이언트는 111 포트로 설정할 수 있습니다. (telnet localhost 111을 통해 터미널에서 테스트).

그러나 도우미 프로세스는 TCPServer 콜백 TCPServerAcceptCallBack을 수신하지 않습니다.

도우미 프로세스에는 com.apple.security.network.client 자격이 활성화되어 있습니다.

또한 도우미 프로세스 대신 기본 응용 프로그램에서 TCPServer를 실행하고 포트 111에서 서버를 설정 한 다음 포트 111에 연결하려고하면 콜백을받습니다.

도우미 프로세스가 소켓 콜백을받지 못하는 이유는 무엇입니까? XPC 관련 문제가 있습니까?

답변

1

이 문제가 발생했습니다.

xpc 서비스는 dispatch_main 유형의 기본 실행 루프를 제공합니다. 따라서,이 작업이 완료되면, 당신은 수동으로 XPC 서비스 내부 실행 루프를 만들

https://developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingXPCServices.html

다음 XPC 서비스 정보 PLIST를 변경하여 수행 -

당신은 NSRunLoop에 있음을 대체 할 라인 : 장소에두고

do { 
    @autoreleasepool { 
     [[NSRunLoop currentRunLoop]run]; 
    } 
} while (YES); 

은 (활성 runloop 필요)를 tcpserver는 콜백을 반환하고 들어오는 데이터를 얻을 수 있습니다.