了解bonjour服务的状态



我正在使用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:。这对我来说是非常违背直觉的;也许服务发布到了适配器,但没有发布到网络,因此这些回调非常具有误导性。在这一点上,我无法知道该服务是否在网络上可见。

为了将来参考,我需要使用变通方法来解决这个问题。问题是Bonjour将其服务发布到协议栈,因此适配器永远不会被查询状态。这是有道理的,因为Bonjour是一个多传输协议。为了解决这个问题,我使用了苹果可达性框架的适配来监听基础设施Wi-Fi的适配器状态变化,在这一点上,我询问适配器是否存在用于Wi-Fi直接支持的adwl0接口。重要提示:该文章声称支持通用Wi-Fi连接,但这不是真的;awdl0接口是Wi-Fi Direct接口,这就是为什么它在iPhone 4/4S等设备中会失败的原因。这没关系,因为这些设备不支持Wi-Fi Direct。由于Bonjour也使用蓝牙,我使用CoreBluetooth来监听蓝牙适配器状态的变化。虽然这个框架是为蓝牙低能耗设计的,但我相信蓝牙适配器是Bonjour服务在网络上可见的有力保证。有点不幸的是,苹果不允许在没有变通办法的情况下这样做,但我想这就是我们所得到的。

相关内容

  • 没有找到相关文章