gpt4 book ai didi

iphone - iOS 上的 NSNetServiceBrowser/Bonjour 问题

转载 作者:技术小花猫 更新时间:2023-10-29 10:38:47 28 4
gpt4 key购买 nike

我正在为我一直从事的 iOS 项目开发的应用程序中通过 WiFi 使用 Bonjour(准确地说是 NSNetServiceBrowser)。

然而,尽管注意到在 Why does NSNetServiceBrowser find unpublished services in iPhone OS? 的出色响应中提出的问题我仍然在使用 NSNetSericeBrowser 时遇到一些困难。

我的设置如下:

  • 使用运行 iOS 4.5.3 的 iPad。
  • 使用 AirPort Express 作为接入点/路由器。
  • 在连接到网络的我的 Mac 上运行 dns-sd -B _serviceName 工作正常——也就是说,所有发布和停止调用都会立即反射(reflect)在桌面上。

但是,我遇到了以下问题:-

  1. 长时间(大约 15 分钟以上)发布的服务往往不会在客户端上删除即使它们从 Mac 上消失了!(即不会调用 didRemoveService)。
  2. 有时发布的服务不会被网络上的其他人看到,即使它们出现在 Mac 上!(即未调用 didFindService)——这可能与第 3/4 点有关下面...如果应用程序在 iPad 连接到网络之前开始运行(和搜索),则它不会正确搜索新网络。
  3. 如果设备在发布服务后更改网络会怎样?我发现 Bonjour 不会在新网络上重新发布该服务——如何强制这样做?
  4. 如果设备在搜索服务时更改网络会怎样?我发现这也会导致问题,并且往往会导致找不到 session (未调用 didFindService)。

我一直遇到的问题很奇怪,因为 Bonjour 在 90% 的时间里都能正常工作……只有那 10% 的时间破坏了我的应用程序的可靠性!令人恼火的是,上述所有问题都可以通过双击主页按钮并强制关闭应用程序,然后重新运行来解决。再次运行后,它总能找到正确的 session 或正确发布。

回避这个问题的一种方法是在无线网络发生变化时拆除并重新启动 NSNetServiceBrowser……但这看起来非常困惑且没有必要。令人沮丧的是,Bonjour 是一个高级 API,没有任何真正的调整和测试选项。

关于如何解决问题 1-4 的任何想法?

谢谢!

最佳答案

好的,我设法解决了它——如果其他人在使用 Bonjour/NSNetServiceBrowser 时遇到这类可靠性问题,这里是我的解决方案:

<强>1。按如下方式安排您的 NSNetService 和 NSNetServiceBrowsers:

[netService scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[netServiceBrowser scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

<强>2。确保从 NSNetServiceBrowserDelegate 实现 netServiceBrowser:didNotSearch: 方法。

当 NSNetService 无法发布时(无论出于何种原因),这将被触发。我所做的是在其中放置一个 UIAlertView 以向用户显示一条消息,说明搜索无法完成,他们应该检查他们的网络连接。浏览似乎一旦能够自动重新启动(但我需要调查一下,也许我的代码中的某些东西正在使它发生......)

关于iphone - iOS 上的 NSNetServiceBrowser/Bonjour 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7645613/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com