Directrices para las aplicaciones con reconocimiento de ubicación

API importantes

En este tema se describen las directrices de rendimiento para las aplicaciones que necesitan acceder a la ubicación de un usuario.

Recomendaciones

  • Empiece a usar el objeto de ubicación solo cuando la aplicación requiera datos de ubicación.

    Llame a RequestAccessAsync antes de acceder a la ubicación del usuario. En ese momento, la aplicación debe estar en primer plano y se debe llamar a RequestAccessAsync desde el subproceso de la interfaz de usuario. La aplicación no puede tener acceso a los datos de ubicación hasta que el usuario conceda permiso.

  • Si la ubicación no es esencial para la aplicación, no acceda a ella hasta que el usuario intente completar una tarea que lo requiera. Por ejemplo, si una aplicación de redes sociales tiene un botón para "Comprobar con mi ubicación", la aplicación no debe acceder a la ubicación hasta que el usuario haga clic en el botón. Está bien acceder inmediatamente a la ubicación si es necesario para la función principal de la aplicación.

  • El primer uso del objeto Geolocalizador debe realizarse en el subproceso de la interfaz de usuario principal de la aplicación en primer plano, para desencadenar la solicitud de consentimiento al usuario. El primer uso del Geolocalizador puede ser la primera llamada a getGeopositionAsync o el primer registro de un controlador para el evento positionChanged.

  • Indique al usuario cómo se usarán los datos de ubicación.

  • Proporcione la interfaz de usuario para permitir que los usuarios actualicen manualmente su ubicación.

  • Muestre una barra de progreso o anillo mientras espera a obtener datos de ubicación.

  • Muestre los mensajes de error o cuadros de diálogo adecuados cuando los servicios de ubicación estén deshabilitados o no estén disponibles.

    Si la configuración de ubicación no permite que la aplicación acceda a la ubicación del usuario, se recomienda proporcionar un vínculo cómodo a la configuración de privacidad de la ubicación en la aplicación Configuración. Por ejemplo, podría usar un control de hipervínculo o llamar al método LaunchUriAsync para iniciar la aplicación Configuración desde el código mediante el URI ms-settings:privacy-location. Para obtener más información, consulte Inicio de la aplicación Configuración de Windows.

  • Borre los datos de ubicación almacenados en caché y libere el Geolocalizador cuando el usuario deshabilite el acceso a la información de ubicación.

    Libere el objeto Geolocalizador si el usuario desactiva el acceso a la información de ubicación a través de Configuración. A continuación, la aplicación recibirá los resultados de ACCESS_DENIED de las llamadas a la API de ubicación. Si la aplicación guarda o almacena en caché los datos de ubicación, borre los datos almacenados en caché cuando el usuario revoque el acceso a la información de ubicación. Proporcione una manera alternativa de escribir manualmente la información de ubicación cuando los datos de ubicación no estén disponibles a través de los servicios de ubicación.

  • Proporcione la interfaz de usuario para volver a habilitar los servicios de ubicación. Por ejemplo, proporcione un botón de actualización que vuelva a crear una instancia del objeto Geolocalizador e intente obtener de nuevo la información de ubicación.

    Haga que la aplicación proporcione la interfaz de usuario para volver a habilitar los servicios de ubicación:

    • Si el usuario vuelve a habilitar el acceso a la ubicación después de deshabilitarlo, no hay ninguna notificación a la aplicación. La propiedad status no cambia y no hay ningún evento statusChanged. La aplicación debe crear un nuevo objeto Geolocalizador y llamar a getGeopositionAsync para intentar obtener los datos de ubicación actualizados o suscribirse de nuevo a eventos positionChanged. Si el estado indica que se ha vuelto a habilitar la ubicación, borre cualquier interfaz de usuario mediante la cual la aplicación notificó previamente al usuario que los servicios de ubicación estaban deshabilitados y responda adecuadamente al nuevo estado.
    • La aplicación también debe intentar obtener datos de ubicación tras la activación, o cuando el usuario intenta usar explícitamente la funcionalidad que requiere información de ubicación o en cualquier otro momento adecuado para el escenario.

Rendimiento

  • Use solicitudes de ubicación única si la aplicación no necesita recibir actualizaciones de ubicación. Por ejemplo, una aplicación que agrega una etiqueta de ubicación a una foto no necesita recibir eventos de actualización de ubicación. En su lugar, debe solicitar la ubicación mediante getGeopositionAsync, como se describe en Obtención de la ubicación actual.

    Al realizar una solicitud de ubicación única, debe establecer los valores siguientes.

    • Especifique la precisión solicitada por la aplicación estableciendo DesiredAccuracy o DesiredAccuracyInMeters. Consulte a continuación para obtener recomendaciones sobre el uso de estos parámetros.
    • Establezca el parámetro de antigüedad máxima de GetGeopositionAsync para especificar cuánto tiempo hace que se puede haber obtenido una ubicación para que sea útil para su aplicación. Si la aplicación puede utilizar una posición de hace unos segundos o minutos, podrá recibir una posición casi de inmediato y contribuir al ahorro de energía del dispositivo.
    • Establezca el parámetro de tiempo de espera de GetGeopositionAsync. Es el tiempo que la aplicación puede esperar a que se devuelva una posición o un error. Tendrá que encontrar el equilibrio entre la capacidad de respuesta al usuario y la precisión que necesita su aplicación.
  • Use la sesión de ubicación continua cuando se requieran actualizaciones de posición frecuentes. Use los eventos positionChanged y statusChanged para detectar el movimiento más allá de un umbral específico o para las actualizaciones de ubicación continua a medida que se producen.

    Al solicitar actualizaciones de ubicación, es posible que quiera especificar la precisión solicitada por la aplicación estableciendo DesiredAccuracy o DesiredAccuracyInMeters. También debe establecer la frecuencia con la que se necesitan las actualizaciones de ubicación mediante MovementThreshold o ReportInterval.

    • Especifique el umbral de movimiento. Algunas aplicaciones solo necesitan actualizaciones de ubicación cuando el usuario se ha desplazado una gran distancia. Por ejemplo, puede que una aplicación que ofrece noticias locales o actualizaciones meteorológicas no necesite actualizaciones de ubicación a menos que la ubicación del usuario haya cambiado a una ciudad diferente. En este caso, deberá ajustar el movimiento mínimo necesario para un evento de actualización de ubicación estableciendo la propiedad MovementThreshold. Esto tiene el efecto de filtrar los eventos PositionChanged. Estos eventos solo se generan cuando el cambio en la posición supera el umbral de movimiento.

    • Use reportInterval alineado con la experiencia de la aplicación y que minimice el uso de recursos del sistema. Por ejemplo, una aplicación meteorológica puede requerir una actualización de datos solo cada 15 minutos. La mayoría de las aplicaciones, salvo las de navegación en tiempo real, no requieren un flujo constante de actualizaciones de ubicación de gran precisión. Si la aplicación no requiere el flujo de datos más preciso posible o requiere actualizaciones con poca frecuencia, establezca la propiedad ReportInterval para indicar la frecuencia mínima de las actualizaciones de ubicación que necesita la aplicación. Así, el origen de la ubicación puede ahorrar energía calculando la ubicación solo cuando sea necesario.

      Las aplicaciones que requieren datos en tiempo real deben establecer ReportInterval en 0 para indicar que no se especifica ningún intervalo mínimo. El intervalo de informe predeterminado es de 1 segundo o tan frecuente como el hardware pueda admitir, lo que sea más corto.

      Los dispositivos que proporcionan datos de ubicación pueden realizar un seguimiento del intervalo de informe solicitado por diferentes aplicaciones y proporcionar informes de datos en el intervalo solicitado más pequeño. De este modo, la aplicación con la mayor necesidad de precisión recibirá los datos que necesite. Por lo tanto, es posible que el proveedor de ubicación genere actualizaciones con una frecuencia mayor que la solicitada por la aplicación, si otra aplicación ha solicitado actualizaciones más frecuentes.

      Nota No se garantiza que el origen de la ubicación respete la solicitud del intervalo de informe especificado. No todos los dispositivos de proveedor de ubicación realizan un seguimiento del intervalo de informe, pero debe proporcionarlo para los que sí lo hacen.

    • Para ayudar a ahorrar energía, establezca la propiedad desiredAccuracy para indicar a la plataforma de ubicación si la aplicación necesita datos de alta precisión. Si ninguna aplicación requiere datos de alta precisión, el sistema puede ahorrar energía al no activar los proveedores de GPS.

      • Establezca desiredAccuracy en ALTA para permitir que el GPS adquiera datos.
      • Establezca desiredAccuracy en Predeterminada y use solo un patrón de llamada de disparo único para minimizar el consumo de energía si la aplicación usa información de ubicación únicamente para la orientación de anuncios.

      Si la aplicación tiene necesidades específicas en torno a la precisión, puede que desee usar la propiedad DesiredAccuracyInMeters en lugar de DesiredAccuracy. Esto es especialmente útil en Windows Phone, donde la posición se puede obtener normalmente en función de balizas móviles, balizas Wi-Fi y satélites. La selección de un valor de precisión más específico ayudará al sistema a identificar las tecnologías adecuadas para usarlas con el menor costo de energía al proporcionar una posición.

      Por ejemplo:

      • Si la aplicación obtiene la ubicación para la optimización de anuncios, el tiempo, las noticias, etc., una precisión de 5000 metros suele ser suficiente.
      • Si la aplicación muestra ofertas cercanas en el vecindario, una precisión de 300 metros suele ser buena para proporcionar resultados.
      • Si el usuario busca recomendaciones para los restaurantes cercanos, es probable que deseemos obtener una posición dentro de un bloque, por lo que una precisión de 100 metros es suficiente.
      • Si el usuario intenta compartir su posición, la aplicación debe solicitar una precisión de unos 10 metros.
    • Use la propiedad Geocoordinate.accuracy si la aplicación tiene requisitos de precisión específicos. Por ejemplo, las aplicaciones de navegación deben usar la propiedad Geocoordinate.accuracy para determinar si los datos de ubicación disponibles cumplen los requisitos de la aplicación.

  • Considere el retraso de inicio. La primera vez que una aplicación solicita datos de ubicación, puede haber un breve retraso (de 1 a 2 segundos) mientras se inicia el proveedor de ubicación. Tenga en cuenta esto en el diseño de la interfaz de usuario de la aplicación. Por ejemplo, puede evitar bloquear otras tareas pendientes de la finalización de la llamada a GetGeopositionAsync.

  • Considere el comportamiento en segundo plano. Si la aplicación no tiene foco, no recibirá eventos de actualización de ubicación mientras está suspendida en segundo plano. Si la aplicación realiza un seguimiento de las actualizaciones de ubicación al registrarlas, tenga en cuenta esto. Cuando la aplicación recupera el foco, solo recibe nuevos eventos. No obtiene ninguna actualización producida cuando estaba inactiva.

  • Utilice sensores sin procesar y de fusión de forma eficaz. Hay dos tipos de sensores: sin procesar y de fusión.

    • Los sensores sin procesar incluyen el acelerómetro, el girómetro y el magnetómetro.
    • Los sensores de fusión incluyen orientación, inclinómetro y brújula. Los sensores de fusión obtienen sus datos de combinaciones de los sensores sin procesar.

    Las API de Windows Runtime pueden acceder a todos estos sensores, excepto al magnetómetro. Los sensores de fusión son más precisos y estables que los sensores sin procesar, pero consumen más energía. Debe usar los sensores adecuados para el propósito adecuado. Para obtener más información, consulte Sensores.

En espera conectado

  • Cuando el equipo está en estado en espera conectado, siempre se pueden crear instancias de objetos de Geolocalizador. Sin embargo, el objeto Geolocalizador no encontrará ningún sensor para agregar y, por tanto, las llamadas a GetGeopositionAsync agotarán el tiempo de espera después de 7 segundos, nunca se llamará a los agentes de escucha de eventos PositionChanged y se llamará a los agentes de escucha de eventos StatusChanged una vez con el estado NoData.

Orientaciones de uso adicionales

Detección de cambios en la configuración de ubicación

El usuario puede desactivar la funcionalidad de ubicación mediante la configuración de privacidad de la ubicación en la aplicación Configuración.

  • Para detectar cuándo el usuario deshabilita o vuelve a habilitar los servicios de ubicación:
    • Controle el evento StatusChanged. La propiedad Status del argumento para el evento StatusChanged tiene el valor Disabled si el usuario desactiva los servicios de ubicación.
    • Compruebe los códigos de error devueltos desde GetGeopositionAsync. Si el usuario ha deshabilitado los servicios de ubicación, las llamadas a GetGeopositionAsync producen un error de ACCESS_DENIED y la propiedad LocationStatus tiene el valor Disabled.
  • Si tiene una aplicación para la que los datos de ubicación son esenciales (por ejemplo, una aplicación de mapas), asegúrese de hacer lo siguiente:
    • Controle el evento PositionChanged para obtener actualizaciones si cambia la ubicación del usuario.
    • Controle el evento StatusChanged como se ha descrito anteriormente, para detectar cambios en la configuración de ubicación.

Tenga en cuenta que el servicio de ubicación devolverá datos a medida que esté disponible. En primer lugar, puede devolver una ubicación con un radio de error mayor y, a continuación, actualizar la ubicación con información más precisa a medida que esté disponible. Normalmente, las aplicaciones que muestran la ubicación del usuario querrán actualizarla a medida que dispongan de información más precisa.

Representaciones gráficas de ubicación

Haga que la aplicación use Geocoordinate.accuracy para indicar claramente la ubicación actual del usuario en el mapa. Hay tres bandas principales para la precisión: un radio de error de aproximadamente 10 metros, un radio de error de aproximadamente 100 metros y un radio de error de más de 1 kilómetro. Con la información de precisión, puede asegurarse de que la aplicación muestre la ubicación con precisión en el contexto de los datos disponibles. Para obtener información general sobre el uso del control de mapa, consulte Visualización de mapas con vistas 2D, 3D y Streetside.

  • Para una precisión aproximadamente igual a 10 metros (resolución GPS), la ubicación puede indicarse mediante un punto o chincheta en el mapa. Con esta precisión, también pueden mostrarse las coordenadas de latitud-longitud y la dirección postal.

    ejemplo de mapa visualizado con una precisión gps de aproximadamente 10 metros.

  • Para una precisión de entre 10 y 500 metros (aproximadamente 100 metros), la ubicación generalmente se recibe a través de la resolución Wi-Fi. La ubicación obtenida de la telefonía móvil tiene una precisión de alrededor de 300 metros. En tal caso, se recomienda que la aplicación muestre un radio de error. Para las aplicaciones que muestran direcciones en las que se requiere un punto de centrado, dicho punto puede mostrarse con un radio de error a su alrededor.

    ejemplo de mapa visualizado con una precisión wi-fi de aproximadamente 100 metros.

  • Si la precisión devuelta es superior a 1 kilómetro, probablemente esté recibiendo información de ubicación con una resolución en el nivel de IP. Este nivel de precisión suele ser demasiado bajo para identificar un punto determinado en un mapa. La aplicación debe hacer zoom hasta el nivel de la ciudad en el mapa o hasta el área apropiada basada en el radio de error (por ejemplo, nivel de región).

    ejemplo de mapa visualizado con una precisión wi-fi de aproximadamente 1 kilómetro.

Cuando la precisión de la ubicación cambia de una banda de precisión a otra, proporcione una transición correcta entre las diferentes representaciones gráficas. Esto se puede hacer:

  • Haga que la animación de transición sea suave y mantenga la transición rápida y fluida.
  • Espere unos cuantos informes consecutivos para confirmar el cambio de precisión, a fin de evitar zooms no deseados y demasiado frecuentes.

Representaciones textuales de ubicación

Algunos tipos de aplicaciones (por ejemplo, una aplicación meteorológica o de información local) necesitan formas de representar textualmente la ubicación en las distintas bandas de precisión. Asegúrese de mostrar la ubicación claramente y solo hasta el nivel de precisión proporcionado en los datos.

  • Para una precisión aproximadamente igual a 10 metros (resolución GPS), los datos de ubicación recibidos son bastante exactos, por lo que pueden comunicarse hasta el nivel del nombre del vecindario. También se puede usar el nombre de la ciudad, el estado o la provincia y el nombre de país o región.
  • Para una precisión aproximadamente igual a 100 metros (resolución Wi-Fi), los datos de ubicación recibidos son moderadamente precisos, por lo que le recomendamos que muestre la información hasta el nombre de la ciudad. Evite usar el nombre del vecindario.
  • Para una precisión superior a 1 kilómetro (resolución IP), muestre solo el estado o la provincia, o el nombre de país o región.

Consideraciones sobre privacidad

La ubicación geográfica de un usuario es información de identificación personal (PII). El siguiente sitio web proporciona instrucciones para proteger la privacidad del usuario.