Проблемы с NSNetServiceBrowser/Bonjour на iOS

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

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

Моя настройка такова:

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

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

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

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

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

Любые идеи, как я могу разобраться в проблемах 1-4?

Спасибо!

Ответ 1

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

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

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

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

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