Partilhar via


Diretrizes para aplicativos com detecção de localização

Este tópico descreve as diretrizes de desempenho para aplicativos que requerem acesso à localização de um usuário.

APIs importantes

Recomendações

  • Comece a usar o objeto de localização somente quando o aplicativo requer dados de localização.

    Chame o RequestAccessAsync antes de acessar a localização do usuário. Nesse momento, seu aplicativo deve estar em primeiro plano e RequestAccessAsync deve ser chamado do thread da interface do usuário. Até que o usuário conceda permissão para a localização a seu aplicativo, o aplicativo não pode acessar os dados de localização.

  • Se a localização não for essencial para seu aplicativo, não a acesse até que o usuário tente concluir uma tarefa que precise dela. Por exemplo, se um aplicativo de rede social tiver um botão para "Fazer check-in usando minha localização", o aplicativo não deverá acessar a localização até que o usuário clique no botão. Não há problema em acessar imediatamente a localização se ela for requerida para a função principal do seu aplicativo.

  • O primeiro uso do objeto Geolocator deve ser feito no thread principal da interface do usuário do aplicativo em primeiro plano, para disparar o prompt de consentimento para o usuário. O primeiro uso do Geolocator pode ser a primeira chamada para getGeopositionAsync ou o primeiro registro de um manipulador para o evento positionChanged.

  • Informe ao usuário como serão usados os dados de localização.

  • Forneça a interface do usuário para permitir que os usuários atualizem manualmente a localização.

  • Exiba uma barra de progresso ou um toque enquanto aguarda para obter dados de localização.

  • Mostre as mensagens de erro ou caixas de diálogo apropriadas quando os serviços de localização estiverem desabilitados ou indisponíveis.

    Se as configurações de localização não permitirem que seu aplicativo acesse a localização do usuário, recomendamos fornecer um link conveniente para as configurações de privacidade de localização no aplicativo de Configurações. Por exemplo, você poderá usar um controle Hyperlink ou chamar o método LaunchUriAsync para iniciar o aplicativo de Configurações a partir do código usando o URI ms-settings:privacy-location. Para saber mais, consulte Iniciar o aplicativo Configurações do Windows.

  • Limpe os dados de localização armazenados em cache e libere o Geolocator quando o usuário desabilitar o acesso às informações de localização.

    Libere o objeto Geolocator se o usuário desativar o acesso às informações de localização por meio de Configurações. O aplicativo receberá resultados ACCESS_DENIED para qualquer chamada de API de localização. Se o aplicativo salvar ou armazenar em cache os dados de localização, limpe todos os dados armazenados em cache quando o usuário revogar o acesso às informações de localização. Forneça uma maneira alternativa de inserir manualmente as informações de localização quando os dados de localização não estiverem disponíveis por meio dos serviços de localização.

  • Forneça a interface do usuário para reabilitar os serviços de localização. Por exemplo, forneça um botão de atualização que reinstancie o objeto Geolocator e tente obter as informações de localização novamente.

    Faça com que seu aplicativo forneça a interface do usuário para reabilitar os serviços de localização nos seguintes casos:

    • Se o usuário reabilitar o acesso à localização depois de desabilitá-lo, não haverá notificação para o aplicativo. A propriedade status não é alterada e não há nenhum evento e não há nenhum evento statusChanged. Seu aplicativo deve criar um novo objeto Geolocator e chamar getGeopositionAsync para tentar obter dados de localização atualizados ou assinar novamente os eventos positionChanged. Se o status indicar que a localização foi reabilitada, limpe qualquer interface do usuário pela qual seu aplicativo tenha notificado anteriormente o usuário de que os serviços de localização foram desabilitados e responda adequadamente ao novo status.
    • O aplicativo também deve tentar novamente obter dados de localização na ativação ou quando o usuário tentar usar explicitamente a funcionalidade que requer informações de localização ou em qualquer outro momento apropriado para o cenário.

Desempenho

  • Use solicitações de localização únicas se seu aplicativo não precisar receber atualizações de localização. Por exemplo, um aplicativo que adiciona uma marca de localização a uma foto não precisa receber eventos de atualização de localização. Em vez disso, ele deve solicitar a localização usando getGeopositionAsync, conforme descrito em Obter localização atual.

    Ao fazer uma solicitação de localização única, você deve definir os valores a seguir.

    • Especifique a precisão solicitada por seu aplicativo definindo o DesiredAccuracy ou o DesiredAccuracyInMeters. Veja abaixo as recomendações sobre o uso desses parâmetros.
    • Defina o parâmetro max age de GetGeopositionAsync para especificar há quanto tempo uma localização pode ter sido obtida para ser útil para seu aplicativo. Se o aplicativo puder usar uma posição que já tenha alguns segundos ou minutos, ele poderá receber uma posição quase imediatamente e contribuir para economizar energia do dispositivo.
    • Defina o parâmetro timeout de GetGeopositionAsync. Esse parâmetro se refere ao tempo que seu aplicativo pode esperar até que uma posição ou um erro seja retornado. Você precisará descobrir as compensações entre a capacidade de resposta ao usuário e a precisão de que seu aplicativo precisa.
  • Use a sessão de localização contínua quando atualizações de posição frequentes forem necessárias. Use os eventos positionChanged e statusChanged para detectar movimentos além de um limite específico ou atualizações de localização contínua à medida que ocorrem.

    Ao solicitar atualizações de localização, convém especificar a precisão solicitada pelo seu aplicativo definindo DesiredAccuracy ou DesiredAccuracyInMeters. Você também deve definir a frequência na qual as atualizações de localização são necessárias, usando MovementThreshold ou ReportInterval.

    • Especifique o limite de movimentação. Alguns aplicativos precisam de atualizações de localização somente quando o usuário se moveu uma grande distância. Por exemplo, um aplicativo que fornece notícias locais ou boletins do tempo pode não precisar de atualizações de localização, a menos que a localização do usuário tenha mudado para uma cidade diferente. Nesse caso, você ajusta a movimentação mínima necessária para um evento de atualização de localização definindo a propriedade MovementThreshold. Isso tem o efeito de filtrar eventos PositionChanged. Esses eventos são gerados somente quando a mudança na posição excede o limite de movimentação.

    • Use reportInterval que se alinha à sua experiência de aplicativo e minimiza o uso de recursos do sistema. Por exemplo, um aplicativo de clima pode requerer uma atualização de dados apenas a cada 15 minutos. A maioria dos aplicativos, exceto os aplicativos de navegação em tempo real, não requer um fluxo constante e altamente preciso de atualizações de localização. Se seu aplicativo não requerer o fluxo de dados mais preciso possível ou requerer atualizações com pouca frequência, defina a propriedade ReportInterval para indicar a frequência mínima de atualizações de localização de que seu aplicativo precisa. A fonte de localização pode economizar energia, calculando a localização apenas quando necessário.

      Os aplicativos que requerem dados em tempo real devem definir a propriedade ReportInterval como 0, para indicar que nenhum intervalo mínimo é especificado. O intervalo de relatório padrão é 1 segundo ou tão frequente quanto o hardware pode suportar, o que for menor.

      Os dispositivos que fornecem dados de localização podem rastrear o intervalo de relatório solicitado por diferentes aplicativos, bem como fornecer relatórios de dados no menor intervalo solicitado. Dessa forma, o aplicativo com maior necessidade de precisão recebe os dados de que precisa. Portanto, é possível que o provedor de localização gerará atualizações em uma frequência maior do que seu aplicativo solicitou, se outro aplicativo tiver solicitado atualizações mais frequentes.

      Observação Não há garantia de que a fonte de localização atenderá à solicitação para o intervalo de relatório especificado. Nem todos os dispositivos do provedor de localização rastreiam o intervalo de relatório, mas você ainda deve fornecê-lo para aqueles que fazem isso.

    • Para ajudar a economizar energia, defina a propriedade desiredAccuracy para indicar à plataforma de localização se seu aplicativo precisa ou não de dados de alta precisão. Se nenhum aplicativo requerer dados de alta precisão, o sistema poderá economizar energia ao não ativar os provedores de GPS.

      • Defina desiredAccuracy como HIGH para permitir que o GPS obtenha os dados.
      • Defina desiredAccuracy como Default e use apenas um padrão de chamada de captura única para minimizar o consumo de energia se seu aplicativo usar informações de localização apenas para direcionamento de um anúncio.

      Se seu aplicativo tiver necessidades específicas em relação à precisão, convém usar a propriedade DesiredAccuracyInMeters, em vez de usar DesiredAccuracy. Isso é útil principalmente no Windows Phone, em que a posição geralmente pode ser obtida com base em sinalizadores de celulares, sinalizadores de Wi-Fi e satélites. Escolher um valor de precisão mais específico ajudará o sistema a identificar as tecnologias certas para usar com o menor custo de energia ao fornecer uma posição.

      Por exemplo:

      • Se o seu aplicativo estiver obtendo localização para ajuste de anúncios, clima, notícias, etc, uma precisão de 5000 metros geralmente será suficiente.
      • Se o seu aplicativo estiver exibindo ofertas próximas na vizinhança, uma precisão de 300 metros geralmente será ideal para fornecer os resultados.
      • Se o usuário estiver procurando recomendações para restaurantes próximos, nossa intenção provavelmente será de obter uma posição dentro de um bloco, portanto uma precisão de 100 metros será suficiente.
      • Se o usuário estiver tentando compartilhar sua posição, o aplicativo deverá solicitar uma precisão de cerca de 10 metros.
    • Use a propriedade Geocoordinate.accuracy se seu aplicativo tiver requisitos de precisão específicos. Por exemplo, os aplicativos de navegação devem usar a propriedade Geocoordinate.accuracy para determinar se os dados de localização disponíveis atendem aos requisitos do aplicativo.

  • Considere o atraso na inicialização. A primeira vez que um aplicativo solicita dados de localização, pode haver um pequeno atraso (1-2 segundos) enquanto o provedor de localização é inicializado. Considere isso no design da interface do usuário do seu aplicativo. Por exemplo, convém evitar o bloqueio de outras tarefas enquanto aguarda a conclusão da chamada para GetGeopositionAsync.

  • Considere o comportamento em segundo plano. Se o seu aplicativo não tiver foco, ele não receberá os eventos de atualização de localização enquanto estiver suspenso no segundo plano. Se seu aplicativo rastrear as atualizações de localização registrando-as em log, esteja ciente disso. Quando o aplicativo recupera o foco, recebe apenas eventos novos. Ele não recebe nenhuma atualização que ocorreu quando estava inativo.

  • Use sensores brutos e de fusão de forma eficiente. Existem dois tipos de sensores: bruto e de fusão.

    • Os sensores brutos incluem o acelerômetro, o giroscópio e o magnetômetro.
    • Os sensores de fusão incluem orientação, inclinômetro e bússola. Os sensores de fusão obtêm os dados a partir de combinações dos sensores brutos.

    As APIs do Windows Runtime podem acessar todos esses sensores, exceto o magnetômetro. Os sensores de fusão são mais precisos e estáveis do que os sensores brutos, mas usam mais energia. Você deve usar os sensores certos para a finalidade certa. Para saber mais, consulte Sensores.

Modo de Espera Conectado

  • Quando o PC está em modo de espera conectado, os objetos Geolocator sempre podem ser instanciados. No entanto, o objeto Geolocator não encontrará nenhum sensor para agregar e, portanto, o tempo limite para as chamadas GetGeopositionAsync expirará após 7 segundos, os ouvintes do evento PositionChanged nunca serão chamados e os ouvintes do evento StatusChanged serão chamados uma vez com o status NoData.

Diretrizes de uso adicionais

Detectando alterações nas configurações de localização

O usuário pode desativar a funcionalidade de localização usando as configurações de privacidade de localização no aplicativo Configurações.

  • Para detectar quando o usuário desabilita ou reabilita os serviços de localização:
    • Manipule o evento StatusChanged. A propriedade Status do argumento para o evento StatusChanged terá o valor Disabled se o usuário desativar os serviços de localização.
    • Verifique os códigos de erro retornados de GetGeopositionAsync. Se o usuário tiver desabilitado os serviços de localização, as chamadas para GetGeopositionAsync falharão com um erro ACCESS_DENIED e a propriedade LocationStatus terá o valor Disabled.
  • Se você tiver um aplicativo para o qual os dados de localização são essenciais, por exemplo, um aplicativo de mapeamento, faça o seguinte:
    • Manipule o evento PositionChanged para obter atualizações se a localização do usuário for alterada.
    • Manipule o evento StatusChanged, conforme descrito anteriormente, para detectar alterações nas configurações de localização.

Observe que o serviço de localização retornará dados à medida que estiverem disponíveis. Ele pode primeiro retornar uma localização com um raio de erro maior e, em seguida, atualizar a localização com informações mais precisas à medida que se tornarem disponíveis. Os aplicativos que exibem a localização do usuário normalmente desejam atualizar a localização à medida que informações mais precisas se tornam disponíveis.

Representações gráficas da localização

Seu aplicativo deve usar Geocoordinate.accuracy para indicar claramente a localização atual do usuário no mapa. Existem três faixas principais para a precisão: um raio de erro de aproximadamente 10 metros, um raio de erro de aproximadamente 100 metros e um raio de erro superior a 1 quilômetro. Usando as informações de precisão, você poderá garantir que seu aplicativo exiba a localização com precisão no contexto dos dados disponíveis. Para obter informações gerais sobre como usar o controle de mapeamento, consulte Exibir mapas com modos de exibição 2D, 3D e Streetside.

  • Para uma precisão aproximadamente igual a 10 metros (resolução do GPS), a localização pode ser indicada por um ponto ou pino no mapa. Com essa precisão, as coordenadas de latitude-longitude e o endereço também podem ser mostrados.

    exemplo de mapa exibido na precisão de GPS de aproximadamente 10 metros.

  • Para precisão entre 10 e 500 metros (aproximadamente 100 metros), a localização geralmente é recebida por meio da resolução de Wi-Fi. A localização obtida do celular tem uma precisão de cerca de 300 metros. Nesse caso, recomendamos que seu aplicativo mostre um raio de erro. Para aplicativos que mostram direções em que um ponto centralizador é necessário, esse ponto pode ser mostrado com um raio de erro ao seu redor.

    exemplo de mapa exibido na precisão de Wi-Fi de aproximadamente 100 metros.

  • Se a precisão retornada for maior que 1 quilômetro, você provavelmente estará recebendo informações de localização na resolução de nível IP. Esse nível de precisão geralmente é muito baixo para identificar um ponto específico em um mapa. Seu aplicativo deve ampliar o nível da cidade no mapa, ou a área apropriada, com base no raio de erro (por exemplo, nível da região).

    exemplo de mapa exibido na precisão de Wi-Fi de aproximadamente 1 quilômetro.

Quando a precisão de localização mudar de uma faixa de precisão para outra, forneça uma transição normal entre as diferentes representações gráficas. Isso pode ser feito das seguintes maneiras:

  • Tornando a animação de transição suave e mantendo a transição rápida e fluida.
  • Aguardando alguns relatórios consecutivos para confirmar a alteração na precisão, a fim de ajudar a evitar zooms indesejados e muito frequentes.

Representações textuais de localização

Alguns tipos de aplicativos, por exemplo, um aplicativo de clima ou um aplicativo de informações locais, precisam de maneiras para representar a localização textualmente nas diferentes faixas de precisão. Certifique-se de exibir a localização de forma clara e somente até o nível de precisão fornecido nos dados.

  • Para uma precisão aproximadamente igual a 10 metros (resolução do GPS), os dados de localização recebidos são bastante precisos e, portanto, podem ser comunicados ao nível do nome do bairro. Também é possível usar o nome da cidade, o nome do estado ou da província e o nome do país/região.
  • Para uma precisão aproximadamente igual a 100 metros (resolução de Wi-Fi), os dados de localização recebidos são moderadamente precisos e, portanto, recomendamos que você exiba informações até o nome da cidade. Evite usar o nome do bairro.
  • Para uma precisão superior a 1 quilômetro (resolução IP), exiba apenas o nome do estado ou da província ou o nome do país/região.

Considerações sobre privacidade

A localização geográfica de um usuário são informações de identificação pessoal (PII). O site a seguir fornece diretrizes para proteger a privacidade do usuário.