2

私がやりたいことは、iPod touch で簡単な bonjour サービスを有効にすることです。カスタム bonjour サービスを公開した後、委任者は "netServiceDidPublish:" 呼び出しを受けませんでした。また、「netService:(NSNetService *)sender didNotPublish:」からのエラー メッセージがないことも確認します。以下は私のコードセクションです:

// AsyncSocket class comes from an awesome project: cocoa async socket.
// http://code.google.com/p/cocoaasyncsocket/
AsyncSocket* listenSocket;

listenSocket = [[AsyncSocket alloc] initWithDelegate:self];
NSError *error;
if (![listenSocket acceptOnPort:0 error:&error])
{
    NSLog(@"Error starting server: %@", error);
    return NO;
}

int port = [listenSocket localPort];

NSLog(@"Server started on port: %hu", port);
isRunning = YES;

// register itself to bonjour service.
netService = [[[NSNetService alloc] initWithDomain:@"local."
                                             type:@"_sampleservice._tcp" 
                                             name:@"myservice" 
                                             port:port] autorelease];

if (!netService)
{
    NSLog(@"Failed to enable net service");
    [listenSocket disconnect];
    return NO;
}

[netService setDelegate:self];
[netService scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
//[netService publishWithOptions:NSNetServiceNoAutoRename];
[netService publish];

このコード セクションの後、「netServiceWillPublish」の委任呼び出しを取得できますが、「netServiceDidPublish」は取得できません。前もって感謝します。

4

2 に答える 2

6

気になったことが二つ。まず、-scheduleInRunLoop:forMode:別の実行ループ (またはモード) に移動する必要がない限り、呼び出すべきではありません。デフォルトでは、現在の実行ループですでにスケジュールされています。次に、サービスを自動解放しているように見えます。つまり、実行ループに戻るとすぐにサービスが解放され、解放されます。ivar またはプロパティに貼り付けて保持する必要があります。

于 2010-10-28T04:07:20.250 に答える