Использование сокетов с NSXPCConnection

Возникла проблема при использовании сокетов с NSXPCConnection.

По сути, есть основной процесс и запущенный вспомогательный процесс, установленный через NSXPCConnection. Этот вспомогательный процесс должен действовать как сервер и прослушивать определенный порт (скажем, 111), который принимает внешние соединения.

Вспомогательный процесс открывает прослушивающий сокет, используя вспомогательный класс TCPServer (оболочка для CFSocket), который предоставляется Apple. Код найден здесь: 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?


person Live2Enjoy7    schedule 06.01.2015    source источник


Ответы (1)


Ок разобрался с вопросом.

Служба xpc предоставляет цикл выполнения по умолчанию типа dispatch_main.

Вы хотите заменить это на NSRunLoop — это можно сделать, изменив информационный список службы xpc:

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

Как только это будет сделано, вы хотите вручную создать цикл выполнения внутри вашей службы xpc по следующим строкам:

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

После этого TCPServer (которому требуется активный цикл выполнения) вернет обратный вызов, и вы сможете получить входящие данные.

person Live2Enjoy7    schedule 07.01.2015