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

时间:2010-06-19 16:29:50

标签: iphone objective-c cocoa-touch networking

我希望能够从运行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的正确轨道上,或者是否有其他方法可以让我枚举连接到我的网络的设备的名称?

1 个答案:

答案 0 :(得分:11)

这是正确的方法。您可能有NSNetServicesBadArgumentError的原因可能是因为您的serviceType字符串@"_services._dns-sd._udp."无效,请尝试@"_services._dns-sd._udp",即没有尾随句点。

Apple的文档在这一点上令人困惑。在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:@""];

不用&尝试看看你有没有运气。