2011-06-25 8 views
5

Permítanme enfatizar el hecho de que estoy hablando del Mac OS X SDK, , no iPhone.Obteniendo notificaciones de accesibilidad en línea/fuera de línea

Con el fin de determinar la "conectividad" y obtener las banderas, hago algo similar a:

#import <SystemConfiguration/SystemConfiguration.h> 
const char *hostName = [@"google.com" cStringUsingEncoding:NSASCIIStringEncoding]; 
SCNetworkReachabilityRef target = SCNetworkReachabilityCreateWithName(NULL, hostName); 
SCNetworkConnectionFlags flags = 0; 
SCNetworkReachabilityGetFlags(target, &flags); 

cual está bien para sólo eso - conseguir información sobre la accesibilidad de Google (que es exactamente lo Quiero saber).

¿Hay alguna manera de agregar un observador a los cambios? He estado buscando en SCDynamicStore, pero el único example de Apple y la documentación me parece abrumador.

Idealmente, me gustaría poder establecer una función para los cambios de bandera, pero esto será suficiente: fíjese cuando la IP se "suelta"/libera, y cuando se obtiene. (Podría hacer la accesibilidad codificada en la función que se desencadena en IP obtenida).

No dude en solicitar elaboraciones.

Respuesta

8

Sí, puede utilizar SCNetworkReachabilitySetCallback y SCNetworkReachabilityScheduleWithRunLoop. No necesita usar SCDynamicStore a menos que quiera mirar específicamente una interfaz de red en particular.

Si desea ver un ejemplo completo, puede ver lo que hice para NCIDpop (un visualizador de identificador de llamadas de red). Buscar SCNetworkReachability en this file. Los comentarios en la función networkReachabilityCallback le dan una idea de qué transiciones de estado esperar (que no estaban terriblemente documentadas cuando escribí ese código).

+0

Gracias, gran descubrimiento! – Josh

3

Utilice las clases de Accesibilidad de Apple Reachability sample code.

  • Es un buen ejemplo para entender cómo funciona Accesibilidad
  • Será mucho más fácil de usar (y habrá de Objective-C y no llanura C)

Especialmente esta muestra hacen que el SCReachability publicar una notificación de llamada kReachabilityChangedNotification en los cambios de accesibilidad, lo que puede añadir a sí mismo como oyente a esta notificación fácilmente usando:

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(reachabilityChanged:) name: kReachabilityChangedNotification object: nil]; 

usted ca n copie/pegue los archivos de Reachability.h & .m en su proyecto (de hecho, eso es lo que todos hacen; ¡No sé por qué Apple no agregó estas clases de Obj-C directamente en sus marcos!)

Nota: Si aún desea utilizar la C sencilla, también puede llamar al SCNetworkReachabilitySetCallback (como se hace en la muestra de Apple anterior) y darle un puntero a una función C en la que implementa su código. Si lo hace, no se olvide de programar la accesibilidad en la Runloop para iniciar el proceso de observación, y sacarlo de la Runloop cuando se hace

+0

He intentado utilizar Reachability.h/m antes, sin suerte. Lo intenté de nuevo, y utilicé el Reachability.h & .m del enlace, pero tengo que hacer algunas correcciones, ¿es esto normal? es decir: línea # 235: 'if ((flags & kSCNetworkReachabilityFlagsIsDirect) == kSCNetworkReachabilityFlagsIsDirect)' y 'kSCNetworkReachabilityFlagsIsWWAN'' kSCNetworkReachabilityFlagsIsDirect'. Al intentar desconectar/reconectar/hacer que el host no esté disponible en/etc/hosts, no envio ninguna notificación a mi aplicación en este momento. – Josh

+0

No, eso no es normal. ¿Qué versión probaste? Quiero decir, ¿lo descargaste recientemente? La muestra se ha actualizado en julio de 2010 para ser compatible con iOS4. En mi propio proyecto utilizo una versión con copyright 2008 (¡debería actualizarlo!) Y no tengo nada en la línea # 235 ... – AliSoftware

+1

Oh, está bien. Lee la primera línea de mi pregunta nuevamente, jeje. Espero que lo agreguen a Lion, y luego utilicen el enfoque de Nicholas hasta entonces. Pero gracias :) – Josh

Cuestiones relacionadas