Objective c NSNetservice未获得NetServicedPublish委托调用

Objective c NSNetservice未获得NetServicedPublish委托调用,objective-c,bonjour,nsnetservice,Objective C,Bonjour,Nsnetservice,我想做的是在我的iPodtouch上启用一个简单的问候服务。 在我发布我的自定义bonjour服务之后,委托人没有得到“netServicedPublish:”调用。我还检查是否存在来自“netService:(NSNetService*)发送方未发布:”的任何错误消息。以下是我的代码部分: // AsyncSocket class comes from an awesome project: cocoa async socket. // http://code.google.com/p/coc

我想做的是在我的iPodtouch上启用一个简单的问候服务。 在我发布我的自定义bonjour服务之后,委托人没有得到“netServicedPublish:”调用。我还检查是否存在来自“netService:(NSNetService*)发送方未发布:”的任何错误消息。以下是我的代码部分:

// 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”委托调用,但是没有人知道“NetServicedPublish”?提前谢谢。

我注意到两件事。首先,您不应该调用
-scheduleinrunop:forMode:
,除非您需要将其移动到其他运行循环(或模式)。默认情况下,它已安排在当前运行循环中。其次,您似乎正在自动释放服务,这意味着一旦您返回到runloop,它将被释放并解除锁定。您需要将其粘贴到ivar或属性中并保留它。

无需
-scheduleinrunlop:forMode
。实际上,根据证明您的
NSNetService
类的库堆栈,您将获得不同的行为,有些行为将失败。您还需要
保留
您的NSNetService

在运行循环上调度
NSNetService
NSNetServiceBrowser
时,我学到了一些不同的行为:

  • 在Mac OS X上的MDN中,可以从
    Foundation
    framework访问,在runloop上没有有害的调度(在Mac OS X 10.5、10.6、10.7和10.8上进行了测试)
  • 如果您使用的是在Avahi兼容模式下编译的GNUStep的
    libgnustep base
    /configure--with zeroconf api=Avahi
    ),它也可以工作,但在我的例子中,如果使用许多正在创建和发布的
    NSNetService
    实例,我会遇到一些分段错误
  • 如果您使用的是在Apple的mDNS兼容模式下编译的GNUStep的
    libgnustep base
    /configure--with zeroconf api=mDNS
    ),它将无法工作。发布NSNetService(错误将出现在
    -netService:didNotPublish:
    )和使用NSNetService浏览器浏览(错误将出现在
    -netService浏览器:didNotSearch:
    )时,您都将收到
    -72003
    错误。使用Avahi的mDNS兼容性代码(
    libavahi-compat-libdnssd1
    )和直接使用Apple的mDNS(不使用Avahi)测试了该场景