And*_*lli 5 bonjour nsnetservice ios nsnetservicebrowser
我正在使用NSNetService和NSNetServiceBrowser在网络上发布和扫描Bonjour服务.实施工作正常,服务在网络上找到,他们能够进行通信.我目前正在尝试理解框架的生命周期,这是我到目前为止所得到的:
// Scanning
netServiceBrowserWillSearch:
netServiceBrowser:didFindService:moreComing: // The device finds itself
// Advertising
netServiceWillPublish:
netServiceDidPublish:
Run Code Online (Sandbox Code Playgroud)
如果我在启用适配器的服务时会发生这种情况.现在,我需要随时了解该服务是否在网络上进行广告宣传; 也就是说,如果其他设备能够找到它.所以我关闭了Wi-Fi适配器进行测试:
netServiceBrowser:didRemoveService:moreComing:
netServiceBrowser:didFindService:moreComing: // The device finds itself again, even after the adapter is turned off
Run Code Online (Sandbox Code Playgroud)
然后我重新打开适配器:
netServiceBrowser:didRemoveService:moreComing:
netServiceBrowser:didFindService:moreComing: // Yet again
Run Code Online (Sandbox Code Playgroud)
问题是打开或关闭适配器绝对没有区别,所以我找不到模式.有没有其他方法可以捕捉到这些事件?
编辑:它变得最糟糕.即使我启动两个适配器关闭的服务(飞行模式)netServiceDidPublish:仍然被调用.到目前为止,似乎netServiceDidNotPublish:仅在我尝试两次注册相同服务时才被调用.这对我来说非常直观; 也许服务已发布到适配器,但不是网络,因此这些回调非常容易引起误解.此时,我无法知道该服务是否在网络上可见.
为了将来参考,我需要使用变通办法来解决这个问题。问题在于 Bonjour 将其服务发布到协议栈,因此适配器永远不会被查询状态。这是有道理的,因为 Bonjour 是一种多传输协议。为了解决这个问题,我使用了 Apple可达性框架的改编版来监听基础设施 Wi-Fi 的适配器状态变化,此时我查询适配器是否存在用于Wi-Fi 直接支持的 adwl0 接口。重要提示:该文章声称找到对一般 Wi-Fi 连接的支持,但事实并非如此;awdl0 接口是 Wi-Fi Direct 接口,这就是为什么在 iPhone 4/4S 等设备中会失败的原因。这没关系,因为这些设备不支持 Wi-Fi Direct。由于 Bonjour 也适用于蓝牙,因此我使用CoreBluetooth来监听蓝牙适配器状态变化。尽管该框架适用于低功耗蓝牙,但我相信蓝牙适配器处于打开状态是 Bonjour 服务在网络上可见的有力保证。有点不幸的是,苹果不允许在没有解决方法的情况下这样做,但我想这就是我们得到的。
| 归档时间: |
|
| 查看次数: |
258 次 |
| 最近记录: |