0

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 関連の問題?

4

1 に答える 1

1

問題を理解しました。

xpc サービスはタイプが dispatch_main のデフォルトの実行ループを提供します。

それを NSRunLoop に置き換えたい - xpc サービス情報 plist を変更することによって行われます:

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

それが完了したら、次の行に沿って、xpc サービス内に実行ループを手動で作成します。

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

これにより、TCPServer (アクティブな実行ループが必要) がコールバックを返し、着信データを取得できるようになります。

于 2015-01-07T05:40:35.810 に答える