6

在 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 类中使用给定的 listenerSocket 进行初始化:

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

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

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

4 回答 4

10

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

即使文档中的示例代码似乎暗示其他方式,也不要为 NSNetServiceBrowser 使用局部变量。一旦超出范围,它就会被垃圾收集。制作finder一个实例变量或属性,使其保持不变。当代表接到电话时,我没有立即发现这一点,netServiceBrowserWillSearch:所以我认为一切都很好......

于 2013-04-14T17:56:51.137 回答
1

我建议不要下载 bonjour 浏览器,而是使用终端命令:

dns-sd -B _chatty._tcp local.

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

于 2013-10-30T13:32:47.783 回答
1

可能的解决方案

  1. 检查两个 WiFi 标识符是否相同
  2. 检查两者是否在同一个 WiFi 网络中
  3. 检查分配为同一类的 NSNetServiceBrowser 委托

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

于 2012-11-23T10:40:13.080 回答
0

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

于 2012-11-23T10:23:54.057 回答