Apple Bonjour:我怎么知道哪个已发布的服务是我自己的?

时间:2011-10-11 09:18:02

标签: ios bonjour nsnetservice nsnetservicebrowser

我有两台iOS设备使用Bonjour API成功找到对方,但由于它们同时发布和浏览,它们也会看到自己出现在可用服务列表中。必须有一些信息,每个端点可以用来确定一个服务是他们自己的,并将其从列表中排除......我确定我只是错过了某个地方 - 任何想法?

我使用the examples from the docs进行了一些小改动。

3 个答案:

答案 0 :(得分:4)

mDNS没有对设备边界进行任何区分 - 链路本地网络上的每个mDNS解析器都会监听默认情况下发送到224.0.0.251所有组播数据包,无论其来源如何。把它想象成一个美化的短波电台。好吧,有点。

这意味着当您浏览服务时,NSNetServiceBrowser不区分主机(有时候我发现它是服务器端应用程序中的一个有用功能)。

我建议忽略自己服务的最简单方法是检查hostname回调中返回的NSNetService对象的netServiceBrowser:didFindService:moreComing:是不是你的,然后再做你做的事了需要做的。

答案 1 :(得分:0)

我正在使用IOS 8.1,我有同样的问题。我最后将didFindService返回的每个服务的名称与代表我的bonjour服务器的本地NSNetService的名称进行比较。

根据我看到的调试我的应用程序,每个NSNetService的主机名都是nil,直到服务解析。在我的情况下,我没有在didFindService中调用resolveWithTimeout,因为我想显示数据需要很长时间。

答案 2 :(得分:0)

如接受的答案所示,将NSNetService名称与设备名称进行比较:

- (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didFindService:(NSNetService *)aNetService moreComing:(BOOL)moreComing
{
    // Ignore the local device if specified
    if ([aNetService.name isEqualToString:UIDevice.currentDevice.name])
    {
        NSLog(@"NETSERVICE: Ignoring NetService for self: '%@'", aNetService.name); 
    }
    else
    {
        ...
    }

    // If that's it then stop the browser (it's manually controlled)
    if (!moreComing) {
        [_netBrowser stop];
    }
}