2011-10-04 11 views
11

Estoy usando Bonjour (NSNetServiceBrowser, para ser precisos) a través de WiFi en una aplicación que estoy desarrollando para un proyecto iOS en el que he estado trabajando.Problemas de NSNetServiceBrowser/Bonjour en iOS

Sin embargo, a pesar de señalar los problemas planteados en la excelente respuesta en Why does NSNetServiceBrowser find unpublished services in iPhone OS?, sigo encontrando una serie de dificultades con NSNetSericeBrowser.

Mi configuración es la siguiente:

  • Trabajar con iOS 4.5.3 iPads con.
  • Uso de un AirPort Express como punto de acceso/enrutador.
  • Ejecutar dns-sd -B _serviceName en mi Mac conectado a la red funciona bien, es decir, todas las llamadas para publicar y detener se reflejan inmediatamente en el escritorio.

Sin embargo, he experimentado los siguientes temas: - (aprox. 15 minutos +)

  1. servicios que se publican durante mucho tiempo tienden a no se eliminan en los clientes a pesar de que desaparezcan de la ¡Mac! (es decir, didRemoveService no se llama).
  2. A veces los servicios que se publican no son vistos por otros en la red, aunque aparezcan en la Mac. (es decir, didFindService no llamado) - esto probablemente esté relacionado con los puntos 3/4 a continuación ... por lo que si la aplicación comienza a ejecutarse (y buscar) antes de que el iPad se conecte a la red, entonces no busca el nuevo red correctamente.
  3. ¿Qué sucede si un dispositivo cambia de red después de publicando un servicio? Descubrí que Bonjour hace no, vuelve a publicar el servicio en la nueva red, ¿cómo puede uno forzar esto?
  4. ¿Qué sucede si un dispositivo cambia de red mientras busca servicios? Descubrí que esto también causa problemas y tiende a que no se encuentre la sesión (didFindService no se llamó).

Los problemas que he tenido son extraños, porque Bonjour funciona el 90% del tiempo ... ¡es solo ese 10% el que está arruinando la fiabilidad de mi aplicación! Lo molesto es que TODOS los problemas anteriores se pueden resolver al presionar dos veces el botón de inicio y cerrar la aplicación, y luego volver a ejecutarla. Después de ejecutarlo nuevamente, SIEMPRE encuentra las sesiones correctas o las publica correctamente.

Una forma de eludir este problema sería desmontar y reiniciar el NSNetServiceBrowser cada vez que se cambie la red inalámbrica ... pero esto parece muy desordenado e innecesario. Lo frustrante es que Bonjour es una API de alto nivel sin opciones reales de ajuste y prueba.

¿Alguna idea de cómo podría resolver los problemas del 1 al 4?

Gracias!

+4

No entiendo por qué esta pregunta no ha recibido más atención, tengo problemas similares y es realmente irritante. – jbat100

Respuesta

6

OK, he conseguido resolverlo - y en caso de cualquier otra persona está experimentando este tipo de problemas de fiabilidad con Bonjour/NSNetServiceBrowser, aquí está mi solución:

1.Horario tanto su NSNetService y NSNetServiceBrowsers de la siguiente manera:

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

2. Asegúrese de que implemente la netServiceBrowser: didNotSearch: Método de NSNetServiceBrowserDelegate.

Esto se disparará cuando el servicio NSNet no pudo publicar (por el motivo que sea). Lo que hice fue poner un UIAlertView allí para mostrar un mensaje al usuario diciendo que la búsqueda no pudo completarse y que deberían verificar su conexión de red. Buscar parece para comenzar automáticamente de nuevo una vez que es capaz de hacerlo (pero necesito investigar esto, tal vez algo en mi código lo está haciendo ...)

+0

Como seguimiento, parece que Bonjour se ha revisado en iOS 5, por lo que es posible que haya un conjunto diferente de problemas que ahora se deben considerar. –

+0

Esto es asombroso. Gracias. Es exactamente lo que necesito –

+2

Gracias, de hecho, descubrí que 'netServiceBrowser: didNotSearch:' se activaba cada vez que la aplicación regresaba del fondo. Entonces, todo lo que hago en ese método es simplemente comenzar a navegar de nuevo sin ningún 'UIAlertView'. Lo he estado ejecutando de esta manera durante algunos meses sin efectos nocivos hasta el momento ... –

Cuestiones relacionadas