【问题标题】:Knowing status of a bonjour service了解 bonjour 服务的状态
【发布时间】:2015-12-21 22:55:42
【问题描述】:

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

【问题讨论】:

  • 我遇到了同样的问题。您找到解决方案了吗?
  • @Mark,刚刚发布了一个答案。祝你好运!

标签: ios bonjour nsnetservice nsnetservicebrowser


【解决方案1】:

为了将来参考,我需要使用变通方法来解决这个问题。问题是 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 不允许在没有变通方法的情况下这样做,但我猜这就是我们所得到的。

【讨论】:

    猜你喜欢
    • 2013-03-23
    • 1970-01-01
    • 2017-03-07
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-13
    • 2011-02-13
    相关资源
    最近更新 更多