2015-12-21 44 views
5

我使用NSNetServiceNSNetServiceBrowser来发布和扫描网络上的Bonjour服务。实施工作正常,服务在网络上找到,他们能够沟通。目前,我试图了解该框架的生命周期,这是我一直这么远:知道Bonjour服务的状态

// Scanning 
netServiceBrowserWillSearch: 
netServiceBrowser:didFindService:moreComing: // The device finds itself 

// Advertising 
netServiceWillPublish: 
netServiceDidPublish: 

如果发生这种情况我在适配器启动服务。现在,我必须始终知道该服务是否在网络上进行了广告宣传。也就是说,如果其他设备能够找到它。所以,我打开Wi-Fi适配器关闭测试:

netServiceBrowser:didRemoveService:moreComing: 
netServiceBrowser:didFindService:moreComing: // The device finds itself again, even after the adapter is turned off 

然后我把适配器背面上:

netServiceBrowser:didRemoveService:moreComing: 
netServiceBrowser:didFindService:moreComing: // Yet again 

的问题是,有绝对接通适配器没有差别或关闭,所以我无法寻找模式。有没有其他方法可以捕捉到这些事件?

编辑:它变得最差。即使我用两个适配器启动服务(飞行模式)netServiceDidPublish:仍然被调用。到目前为止,似乎netServiceDidNotPublish:只有当我尝试注册两次相同的服务时才被调用。这对我来说非常直观。也许该服务发布到适配器,但不是网络,因此这些回调非常具有误导性。此时,我无法知道该服务在网络上是否可见。

+0

我遇到了同样的问题。你有没有找到解决方案? – Mark

+0

@Mark,刚发布了一个答案。最好的运气! –

回答

0

为了将来的参考,我需要使用解决方法来解决这个问题。问题是Bonjour将它的服务发布到协议栈,所以适配器永远不会被查询状态。这是有道理的,因为Bonjour是一个多传输协议。为了解决这个问题,我使用了苹果的reachability框架来适应基础设施Wi-Fi的适配器状态变化,在此时Wi-Fi直接支持I query the adapter for the presence of the adwl0 interface。重要说明:该文章宣称支持一般Wi-Fi连接,这不是真的; awdl0接口是Wi-Fi Direct接口,这就是为什么在iPhone 4/4S等设备中这会失败。这很好,因为这些设备不支持Wi-Fi Direct。由于Bonjour也适用于蓝牙,因此我使用CoreBluetooth来侦听蓝牙适配器状态更改。尽管此框架适用于蓝牙低功耗,但我相信蓝牙适配器处于开启状态可以确保Bonjour服务在网络上可见。不幸的是,苹果公司不允许在没有解决方法的情况下这样做,但我们猜测这就是我们得到的结果。