NSNetServiceBrowser / Bonjour проблемы на iOS - PullRequest
12 голосов
/ 04 октября 2011

Я использую Bonjour (если быть точным, NSNetServiceBrowser) через WiFi в приложении, которое я разрабатываю для проекта iOS, над которым я работаю.

Однако, несмотря на отмеченные проблемы в превосходном ответе на Почему NSNetServiceBrowser находит неопубликованные сервисы в iPhone OS? Я все еще сталкиваюсь с рядом трудностей с NSNetSericeBrowser.

Моя установка выглядит следующим образом:

  • Работа с iPad под iOS 4.5.3.
  • Использование AirPort Express в качестве точки доступа / маршрутизатора.
  • Запуск dns-sd -B _serviceName на моем Mac, подключенном к сети, работает нормально - то есть все вызовы публикации и остановки немедленно отражаются на рабочем столе.

Однако у меня возникли следующие проблемы: -

  1. Службы, которые публикуются в течение длительного времени (около 15 минут и более), как правило, не удаляются на клиентах , даже если они исчезают с Mac! (то есть didRemoveService не вызывается).
  2. Иногда опубликованные сервисы не видны другим в сети, , даже если они появляются на Mac! (т. Е. DidFindService не вызывается) - это, вероятно, связано с пунктами 3/4 ниже ... при этом если приложение запускается (и выполняет поиск) до того, как iPad подключен к сети, оно не выполняет поиск в новой сети должным образом.
  3. Что произойдет, если устройство изменит сеть после публикации службы? Я обнаружил, что Bonjour не повторно публикует службу в новой сети - как можно заставить это произойти?
  4. Что произойдет, если устройство меняет сеть при поиске услуг ? Я обнаружил, что это также вызывает проблемы и приводит к тому, что сеанс не найден (didFindService не вызывается).

Проблемы, с которыми я сталкивался, странные, потому что Bonjour работает 90% времени ... только те 10% разрушают надежность моего приложения! Раздражает то, что ВСЕ из вышеперечисленных проблем можно решить, дважды нажав кнопку «Домой» и принудительно закрыв приложение, а затем повторно запустив его. После повторного запуска он ВСЕГДА находит нужные сеансы или публикует их правильно.

Один из способов обойти эту проблему - отключить и перезапустить NSNetServiceBrowser всякий раз, когда меняется беспроводная сеть ... но это кажется очень грязным и ненужным. Огорчает то, что Bonjour - это высокоуровневый API без каких-либо реальных возможностей для настройки и тестирования.

Есть идеи, как мне разобраться с проблемами 1-4?

Спасибо!

1 Ответ

6 голосов
/ 06 октября 2011

ОК, мне удалось ее решить - и в случае, если кто-то еще испытывает подобные проблемы с надежностью с Bonjour / NSNetServiceBrowser, вот мое решение:

1. Запланируйте ваши NSNetService и NSNetServiceBrowsers следующим образом:

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

2. Убедитесь, что вы реализовали netServiceBrowser: didNotSearch: метод из NSNetServiceBrowserDelegate.

Это сработает, когда NSNetService не смог опубликовать (по какой-либо причине). Я добавил UIAlertView для отображения сообщения, в котором говорилось, что поиск не может быть завершен, и что он должен проверить свое сетевое соединение. Просмотр кажется автоматически запускается снова, как только он может это сделать (но мне нужно разобраться с этим, возможно, что-то в моем коде заставляет это случиться ...)

...