NSNetServiceBrowser/Bonjour проблемы на iOS
Я использую Bonjour (если быть точным, NSNetServiceBrowser) через WiFi в приложении, которое я разрабатываю для проекта iOS, над которым я работаю.
Тем не менее, несмотря на отмеченные проблемы в превосходном ответе в разделе Почему NSNetServiceBrowser находит неопубликованные сервисы в iPhone OS? Я все еще сталкиваюсь с рядом трудностей с NSNetSericeBrowser.
Моя установка выглядит следующим образом:
- Работа с iPad под 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, чтобы отобразить сообщение для пользователя, в котором говорится, что поиск не может быть завершен и что он должен проверить свое сетевое соединение. Кажется, что просмотр автоматически начинается снова, как только он может это сделать (но мне нужно разобраться с этим, возможно, что-то в моем коде делает это возможным...)