我有两台iOS设备使用Bonjour API成功找到对方,但由于它们同时发布和浏览,它们也会看到自己出现在可用服务列表中。必须有一些信息,每个端点可以用来确定一个服务是他们自己的,并将其从列表中排除......我确定我只是错过了某个地方 - 任何想法?
我使用the examples from the docs进行了一些小改动。
答案 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];
}
}