2012-09-19 18 views
9

Veo muchos ejemplos de Accesibilidad en los que las personas solo muestran un mensaje cuando cambia el estado de accesibilidad.
Pero recientemente, vi en la aplicación Foursquare que muestran un mensaje cada vez que el usuario intenta realizar una acción que requiere una conexión a Internet.
Creo que esto es más robusto y un mejor UX para recordarle al usuario que no puede hacer nada sin Internet. Principalmente porque los usuarios pueden cambiar de aplicación, hacer otra cosa y olvidar que no tiene conexión cuando regrese.
Además, tan pronto como recuperan la conexión, veo que obtienen datos de Internet y actualizan la interfaz de usuario.¿Debo escuchar las actualizaciones de accesibilidad en cada UIViewController?

Lo que realmente estoy buscando es la mejor manera de hacerlo. ¿Cómo se hace esto?
¿Tienen un UIViewController general que verifica la accesibilidad cada vez que necesita una conexión?
¿O tienen un tipo de clase proxy antes de cada solicitud de Internet que cancela la solicitud y muestra un mensaje? ¿Cómo están lidiando con eso?

Gracias.

EDIT:

La solución que se me ocurrió es usar AFNetworking que también proporcionan estado de disponibilidad en el cuadro.
Básicamente creé un AFHTTPClient y establecí un bloque de devolución de llamada de accesibilidad para escuchar los cambios de estado. El objeto AFHTTPClient es para toda la aplicación (tipo de singleton). (De hecho, tengo un AFHTTPClient por host que necesito para llegar a a.com, b.com ...).

Luego, cuando necesito realizar una solicitud, creo una nueva AFHTTPRequestOperation (AFJSONRequestOperation en mi caso) y la encola en mi objeto AFHTTPClient. En el bloque de falla de la operación, verifico si el host es alcanzable con la propiedad networkReachabilityStatus del AFHTTPClient. Si es inalcanzable, mostraré un mensaje de que no hay conexión a Internet para el usuario.

Lo terminé, así que no tengo que hacer esto cada vez que creo una operación. Entonces, ahora en la aplicación, cada vez que el usuario intenta hacer algo cuando no hay conexión, recibe un mensaje recordándole que no tiene acceso a internet.
También uso la devolución de llamada de accesibilidad para volver a cargar datos en una pantalla una vez que recupero la conexión (o más bien, una vez que se supone que tengo una conexión).
No sé si es la mejor práctica, pero creo que es bueno saber que la aplicación se encarga de volver a cargar datos importantes tan pronto como haya una nueva conexión disponible.

Si a alguien le interesa un código de muestra, puedo proporcionarlo.

Respuesta

15

En una charla de WWDC este año, el ingeniero de Apple en el escenario recomendó a los usuarios que nunca basen el acceso a la aplicación a Internet en el estado de la aplicación de ejemplo de Accesibilidad.A menudo, la accesibilidad no proporciona una información completa (que se basa en un mecanismo complejo) y la sugerencia proporcionada por el ingeniero era la siguiente:

  1. tratar de hacer la conexión a Internet, cualquiera que sea el estado de disponibilidad; luego configure su sugerencia de UI en función del resultado de éxito/falla
  2. si falla debido a un problema de red, luego regístrese en Accesibilidad y vuelva a intentarlo cuando Alcance le dé luz verde; esto es necesario cuando desea recuperar automáticamente de la condición de falla
  3. en cualquier caso, le da al usuario la posibilidad de "forzar el reintento", cualquiera que sea el estado de Accesibilidad. Si tiene éxito, restablece tu sugerencia de UI de inmediato.

Lo que dijo el ingeniero de Apple es perfectamente cierto: con frecuencia se puede ver en el registro de la consola los mensajes de falla de accesibilidad mientras la conexión a Internet está perfectamente viva.

Otra cosa: no hay mejor "pista de red" que la que se muestra en la barra de estado: si tiene allí el ícono de wi-fi, el ícono 3G/4G, la intensidad del campo celular.

Volviendo a su pregunta original: no hay una mejor manera absoluta de administrar esto, esto depende en gran medida de la arquitectura de la aplicación. En caso de que prefiera concentrar sus elementos de red en una clase dedicada (no un UIViewController sino una subclase NSObject), entonces podría tener sentido definir una propiedad de solo lectura para esa clase que se actualice con "éxito/error" después de la última conexión a Internet con la aplicación de servidores (no tiene sentido hacer ping a otros servidores como Google o Apple: primero, no es elegante, ¡segundo, el problema puede venir de los servidores que sirven la aplicación y no del estado de la conexión a Internet del dispositivo!).

@property (readonly) BOOL lastConnectionToMyServerSuccess
Luego sus controladores de vista pueden registrarse (por KVO o por notificación central) a los cambios de esta propiedad y actualizar su UI según corresponda mostrando un ícono o no (repito: deje al usuario la posibilidad de intentarlo manualmente para conectarse a Internet). Los controladores de vista deben anular el registro de KVO cuando están fuera de la vista ("viewWillDisappear:") o descargarse ("viewDidLoad:") o deshacerse de él.

Por supuesto, esto agrega algunas complejidades adicionales. Por ejemplo, si usas la aplicación, la luz de internet era verde. Luego lo suspendes, haces otra cosa y luego de unos minutos vuelves a la aplicación. En tal caso, la aplicación debe enviar un ping a sus servidores para restablecer nuevamente el estado de la luz de Internet, ya que después de unos minutos las condiciones de la red podrían haber cambiado (por ejemplo, usted está en un tren). En cualquier caso, todos los controladores de vista cargados recibirán la notificación KVO de la clase dedicada de la red y se actualizarán ellos mismos.

+0

Muchas gracias por esta respuesta, ¿recuerda qué video/charla WWDC es? – florian

+0

No estoy seguro de recordarlo. Pruebe las sesiones 706 y 225 (segunda parte de la sesión). – viggio24

Cuestiones relacionadas