NSNetservice没有获得netServiceDidPublish委托调用

时间:2010-10-21 06:12:16

标签: objective-c bonjour nsnetservice

我想要做的是在我的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”有人有任何想法吗?提前谢谢。

2 个答案:

答案 0 :(得分:6)

我发现了两件事。首先,除非您需要将其移动到其他runloop(或模式),否则不应调用-scheduleInRunLoop:forMode:。默认情况下,它已经安排在当前的运行循环中。其次,您似乎是自动释放该服务,这意味着一旦您返回到runloop,它就会被释放并释放。你需要把它贴在伊娃或财产中并坚持下去。

答案 1 :(得分:2)

无需-scheduleInRunLoop:forMode。实际上,根据证明你的NSNetService类的库堆栈,你会得到不同的行为,有些会失败。您还需要retain您的NSNet服务。

我在runLoop上安排NSNetServiceNSNetServiceBrowser时学到了一些不同的行为:

  1. 在Mac OS X上的mDNS中,从Foundation框架访问,在runloop上没有任何损害安排(在Mac OS X 10.5,10.6,10.7和10.8上测试)。
  2. 如果您使用的是在Avahi兼容模式(libgnustep-base)中编译的GNUStep ./configure --with-zeroconf-api=avahi,它也可以正常工作,但在我的情况下,如果使用了很多NSNetService个实例,我会遇到一些分段错误并释放。
  3. 如果您使用的是在Apple的mDNS兼容模式(libgnustep-base)中编译的GNUStep ./configure --with-zeroconf-api=mdns,则无效。对于发布NSNetService(错误将在-72003中)以及使用NSNetServiceBrowser进行浏览,您将收到-netService:didNotPublish:错误(错误将在-netServiceBrowser:didNotSearch:中出现)。使用Avahi的mDNS兼容性代码(libavahi-compat-libdnssd1)和直接使用Apple的mDNS测试此方案,而不使用Avahi。
相关问题