我正在使用NSNetService和NSNetServiceBrowser在网络上发布和扫描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 :(得分:0)
为了将来参考,我需要使用变通方法来解决这个问题。问题是Bonjour将其服务发布到协议栈,因此永远不会查询适配器的状态。这是有道理的,因为Bonjour是一种多传输协议。为了解决这个问题,我使用了Apple的reachability框架来调整基础设施Wi-Fi的适配器状态更改,此时我query the adapter for the presence of the adwl0 interface用于Wi-Fi直接支持。重要提示:该文章声称支持一般的Wi-Fi连接,这不是真的; awdl0接口是Wi-Fi Direct接口,这就是iPhone 4 / 4S等设备失败的原因。这没关系,因为这些设备不支持Wi-Fi Direct。由于Bonjour也适用于蓝牙,我使用CoreBluetooth来监听蓝牙适配器状态的变化。虽然这个框架适用于蓝牙低功耗,但我相信蓝牙适配器可以确保Bonjour服务在网络上可见。有点不幸的是,Apple没有办法在没有解决方法的情况下做到这一点,但我认为这就是我们所得到的。