在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:@""];
答案 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)
可能的解决方案
- 检查两个WiFi标识符是否相同
- 检查两者是否在同一个WiFi网络
- 检查指定为同一类
的NSNetServiceBrowser委托 醇>
最后下载示例Apple.Developer Witap Application,安装在两个设备上,测试并确认它正常工作。