5

我正在使用NSNetServiceNSNetServiceBrowser在网络上发布和扫描 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:仅在我尝试注册同一服务两次时才被调用。这对我来说非常违反直觉;也许服务已发布到适配器,但没有发布到网络,因此这些回调非常具有误导性。在这一点上,我无法知道该服务在网络上是否可见。

4

1 回答 1

0

为了将来参考,我需要使用变通方法来解决这个问题。问题是 Bonjour 将其服务发布到协议栈,因此适配器永远不会被查询状态。这是有道理的,因为 Bonjour 是一种多传输协议。为了解决这个问题,我使用了 Apple可达性框架的改编版本来监听基础设施 Wi-Fi 的适配器状态变化,此时我查询适配器是否存在 adwl0 接口以支持 Wi-Fi 直接支持。重要提示:该文章声称找到对一般 Wi-Fi 连接的支持,但事实并非如此; awdl0 接口是 Wi-Fi Direct 接口,这就是为什么这在 iPhone 4/4S 等设备上会失败。这没关系,因为这些设备不支持 Wi-Fi Direct。由于 Bonjour 也适用于蓝牙,我使用CoreBluetooth来监听蓝牙适配器状态的变化。尽管此框架适用于低功耗蓝牙,但我相信蓝牙适配器处于开启状态是 Bonjour 服务在网络上可见的有力保证。不幸的是,Apple 不允许在没有变通方法的情况下这样做,但我猜这就是我们得到的。

于 2016-02-09T15:57:27.420 回答