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

Я использую Bonjour (точнее, NSNetServiceBrowser) через Wi-Fi в приложении, которое я разрабатываю для проекта 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 ниже. y при этом, если приложение запускается (и выполняет поиск) до того, как iPad будет подключен к сети, оно не будет выполнять поиск в новой сети должным образом.
  3. Что произойдет, если устройство сменит сеть после публикации службы? Я обнаружил, что Bonjour не повторно публикует службу в новой сети - как это сделать?
  4. Что произойдет, если устройство сменит сеть во время поиска услуг? Я обнаружил, что это тоже вызывает проблемы и обычно приводит к тому, что сеанс не обнаруживается (didFindService не вызывается).

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

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

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

Спасибо!


person Jonathan Ellis    schedule 04.10.2011    source источник
comment
Не понимаю, почему этому вопросу не уделяют больше внимания, у меня похожие проблемы, и это действительно раздражает.   -  person jbat100    schedule 25.10.2011


Ответы (1)


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

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

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

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

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

person Jonathan Ellis    schedule 06.10.2011
comment
В качестве продолжения, похоже, что Bonjour был переработан в iOS 5, поэтому теперь может быть рассмотрен другой набор проблем. - person Jonathan Ellis; 12.10.2011
comment
Это круто. Спасибо. Это именно то, что мне нужно - person Dylan Gattey; 05.01.2012
comment
Спасибо, на самом деле я обнаружил, что netServiceBrowser:didNotSearch: запускается каждый раз, когда приложение возвращается из фона. Таким образом, все, что я делаю с помощью этого метода, это просто снова начинаю просматривать страницы без каких-либо UIAlertView. Вот так вот уже несколько месяцев работаю без каких-либо побочных эффектов ... - person Jonathan Ellis; 10.01.2012
comment
Удалось ли вам что-нибудь сделать относительно автоматического запуска просмотра? В частности, мне нужно знать, когда запускается браузер. В настоящее время я не получаю никаких событий, если браузер запускается самопроизвольно. То есть: начало - ›выключить адаптер (нет события) -› включить адаптер (нет события) - ›просмотр начнется сам по себе. Мне нужно прислушаться к этому жизненному циклу - person André Fratelli; 21.12.2015