У меня есть следующий код для обнаружения служб в сети:
[netServiceBrowser setDelegate: self];
[netServiceBrowser searchForServicesOfType: serviceType inDomain: domain];
Это приводит к вызовам этих двух методов (найти службу и удалить службу):
- (void) netServiceBrowser:(NSNetServiceBrowser*) netServiceBrowser
didFindService:(NSNetService*) netService ... {}
- (void) netServiceBrowser:(NSNetServiceBrowser*) netServiceBrowser
didRemoveService:(NSNetService*) netService ... {}
Это отлично работает. Когда я выключаю свое устройство, я немедленно получаю вызов didRemoveService .
Однако когда я открываю поток (ввод, вывод или оба) на устройство:
[netService getInputStream: &inputStream outputStream: &outputStream];
[inputStream setDelegate: self];
[outputStream setDelegate: self];
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode: NSDefaultRunLoopMode];
[inputStream open];
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
[outputStream open];
Он внезапно NSNetServiceBrowser почти за минуту обнаруживает, что я выключил устройство
(для вызова didRemoveService требуется минута).
Устройства, с которыми я не общаюсь (открывающие потоки), по-прежнему вызывают didRemoveService , как только я их удаляю.
Обновление: Вот немного дополнительной информации, связанной с моей проблемой.
Я провел трассировку с помощью Wireshark и заметил следующее:
Я запускаю свое приложение в симуляторе iPad, приложение запускает NSNetServiceBrowser и обнаруживает принтер. После этого открывается потоки ввода / вывода на устройство (через airport express, usb). В принтер отправляет мне обновления статуса, и когда я нажимаю кнопку тестирования в мое приложение принтер начинает печать. В Wireshark я вижу все связь с принтером, как ожидалось.
Теперь, когда я запускаю то же самое приложение на iPad (и оставляю Симулятор iPad запущен).Приложение запускает NSNetServiceBrowser также обнаруживает принтер. Принтер не отправляет мне обновления статуса, и когда я нажимаю кнопку тестирования, принтер не печатает. В Wireshark я вижу общение. В принтер или аэропорт получает мои команды и отправляет пакет ACK.
Как только я закрываю приложение-симулятор iPad, принтер начинает печатать команды, которые я отправил с iPad. Кажется, что открытие сокета блокирует все события Bonjour, как я могу предотвратить это?
Подробнее здесь: https://devforums.apple.com/message/541436