如何使用Cocoa Touch发现网络设备?

7

我希望能够从运行iPhone OS 3.x(iPhone / iPad)的设备上枚举本地网络上设备的名称。我尝试使用NSNetServiceBrowser查找所有服务,如下所示:

[serviceBrowser searchForServicesOfType:@"_services._dns-sd._udp." inDomain:@"local."];

这将返回结果,但当我尝试解析地址时,会收到以下错误信息。
NSNetServicesErrorCode = -72004;
NSNetServicesErrorDomain = 10;

我查看了错误信息,似乎是有一个错误的参数?

[kCFNetServiceErrorBadArgument
A required argument was not provided or was not valid.]

如果我进行服务特定搜索,比如[serviceBrowser searchForServicesOfType:@"_ipp._tcp." inDomain:@""];,解析工作正常。

那么,我是否正在使用正确的NSNetServiceBrowser方法,或者还有其他方法可以枚举连接到我的网络上的设备名称?


有关这方面的任何消息吗?我非常感兴趣,想知道您是如何解决这些问题的。 - samsam
我遇到了完全相同的问题。解决方法是什么? - profused
1个回答

11

这是正确的方法。可能导致您出现NSNetServicesBadArgumentError错误的原因是,您的服务类型字符串@"_services._dns-sd._udp."无效,请改用@"_services._dns-sd._udp",即不要使用末尾带有句点的字符串。

在这一点上,苹果的文档有些令人困惑。 在NSNetServiceBrowser Class Reference中,它指出:

serviceType参数必须包含服务类型和传输层信息。 为了确保mDNS响应者搜索服务而不是主机,请务必在服务名称和传输层名称前面加下划线字符(“_”)。 例如,要在TCP上搜索HTTP服务,您将使用类型字符串“_http._tcp.“。请注意,末尾的句点字符是必需的。

然而,在NSNetServices and CFNetServices Programming Guide中,初始化浏览器并开始搜索的示例清楚地没有使用末尾句点:

serviceBrowser = [[NSNetServiceBrowser alloc] init];
[serviceBrowser setDelegate:delegateObject];
[serviceBrowser searchForServicesOfType:@"_music._tcp" inDomain:@""];

不加尝试一下,看看是否有运气。


1
我遇到了完全相同的问题,而删除“尾部”句点在我的情况下并没有解决它。该怎么办? - profused

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接