NSNetServiceBrowser找不到已发布的服务

时间:2012-11-23 10:04:47

标签: objective-c

在iPhone(服务器)上,我尝试发布服务,我的代码遇到了NSNetService对象的委托方法:

-(void)netServiceDidPublish:(NSNetService *)sender

所以我相信我的服务@"_chatty._tcp."已成功发布。然后在另一个iPhone(客户端)上,我使用NSNetServiceBrowser来查找我的服务,但它没有遇到委托方法:

-(void)netServiceBrowser:(NSNetServiceBrowser *)netServiceBrowser didFindService:(NSNetService *)netService moreComing:(BOOL)moreServicesComing

我在本网站上发现了一些与我的案例相关的问题,大多数答案提醒检查委托对象是否超出范围。我确信我的代表工作得很好,因为它遇到了另一个委托方法,如:

-(void)netServiceBrowserWillSearch:(NSNetServiceBrowser *)aNetServiceBrowser

有人可以帮我找出原因吗?

以下是我的代码的一些部分:

我这样启动服务:

#define MY_PROTOCOL @"_chatty._tcp."

self.myService = [[NSNetService alloc]
                   initWithDomain:@"" type:MY_PROTOCOL
                   name:@"thaith" port:self.port];

使用Browser类中的给定listenSocket初始化端口:

NSNetServiceBrowser* finder = [[NSNetServiceBrowser alloc] init];

//I also retain the finder.
finder.delegate = self;

[finder searchForServicesOfType:MY_PROTOCOL inDomain:@""];

4 个答案:

答案 0 :(得分:9)

遇到同样的问题并放弃了一个月。我刚刚回到它并解决了它:

即使the sample code in the docs似乎暗示其他情况,也不要使用本地变量作为NSNetServiceBrowser。一旦超出范围,就会收集垃圾。使finder成为一个实例变量或属性,以便它可以使用它。当netServiceBrowserWillSearch:代表被调用时,我没有立即发现这一点,所以我认为一切都很好......

答案 1 :(得分:1)

我建议使用终端命令:

,而不是下载bonjour浏览器
dns-sd -B _chatty._tcp local.

对我来说,它表明服务器端工作正常。 目前,我可以在我的应用程序启动时找到该服务,我唯一的问题是,一旦我停止服务器,我得到“已删除”事件但再次运行它,我再也找不到了。我知道问题出在我的客户端,感谢dns-sd-B

答案 2 :(得分:0)

我会缩小范围并尝试找到问题所在。首先,找出服务是否正确发布。在发布服务的同一本地网络中的计算机上使用Bonjour Browser应用程序(您可以在Internet中找到它)。我希望你在同一个本地网上发布和浏览。如果Bonjour浏览器可以看到您的服务,那么您就知道它已正确发布。然后在浏览器端工作以连接它。

答案 3 :(得分:0)

可能的解决方案

  
      
  1. 检查两个WiFi标识符是否相同
  2.   
  3. 检查两者是否在同一个WiFi网络
  4.   
  5. 检查指定为同一类
  6. 的NSNetServiceBrowser委托   

最后下载示例Apple.Developer Witap Application,安装在两个设备上,测试并确认它正常工作。