Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 苹果晚安:我怎么知道哪项发布的服务是我自己的?_Ios_Bonjour_Nsnetservice_Nsnetservicebrowser - Fatal编程技术网

Ios 苹果晚安:我怎么知道哪项发布的服务是我自己的?

Ios 苹果晚安:我怎么知道哪项发布的服务是我自己的?,ios,bonjour,nsnetservice,nsnetservicebrowser,Ios,Bonjour,Nsnetservice,Nsnetservicebrowser,我有两台iOS设备使用Bonjour API成功地找到了对方,但由于它们都同时发布和浏览,它们也看到自己出现在可用服务列表中。每个端点都必须有一些信息可以用来确定某个服务是他们自己的,并将其从他们的列表中排除。。。我肯定我在什么地方错过了-有什么想法吗 我使用了一些小改动。mDNS不区分设备边界-链路本地网络上的每个mDNS解析器都会侦听默认情况下发送到224.0.0.251的所有多播数据包,无论其来源如何。可以把它想象成一台光彩夺目的短波收音机。嗯,有点 这意味着当您浏览服务时,NSNetSe

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


我使用了一些小改动。

mDNS不区分设备边界-链路本地网络上的每个mDNS解析器都会侦听默认情况下发送到
224.0.0.251
的所有多播数据包,无论其来源如何。可以把它想象成一台光彩夺目的短波收音机。嗯,有点

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


我建议忽略您自己的服务最简单的方法是检查
NSNetService
对象的
hostname
,该对象在
netServiceBrowser:didFindService:moreComing:
回调之前不属于您。我使用的是IOS 8.1,我也有同样的问题。最后,我将didFindService返回的每个服务的名称与代表bonjour服务器的本地NSNetService的名称进行了比较


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

正如接受的答案所暗示的,将
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];
    }
}

谢谢你,克里斯。我会给它打绿色的勾,因为它似乎是最好的,可以做的。我之前确实想到过这一点,但我希望有一种比检查文本名称更明确的方法,文本名称在不同的设备上可能是相同的。你可以在服务的TXT中设置一个唯一的ID,这样你就可以识别自己了。关于UUID,请参阅。@huyz yep,正如我在对已接受答案的评论中所提到的,如果两个设备具有相同的名称,则这不起作用。此外,我还发现UIDevice.currentDevice.name并不总是与设备的“你好”网络名称相同!我不知道如何直接获取设备的bonjour网络名,但在我的例子中,我使用的是网络MIDI,因此我不使用上面的检查,而是比较[aNetService.name IsequalString:[MidNetworkSession defaultSession].networkName]我多年来一直使用这种技术。但是,既然我们知道您正在为MIDI执行此操作,请注意,
MIDINetworkSession
有一个
networkName
,这可能是您应该使用的?我现在就试试抱歉:我已经这么做了,我还检查了currentDevice.name。这很有效。。。如果这两个都是真的,那就是我们自己。现在。。。如果我真的能控制MidNetworkSession.defaultSession实际使用的名称,我会很高兴。哦,查德威克已经说过这些了。不管怎样,继续前进。。。