Linee guida per le app in grado di riconoscere la posizione

API importanti

Questo argomento descrive le prestazioni per le app che richiedono l'accesso alla posizione di un utente.

Consigli

  • Iniziare a usare l'oggetto posizione solo quando l'app richiede dati sulla posizione.

    Chiamare RequestAccessAsync prima di accedere alla posizione dell'utente. A questo punto, l’app deve essere in primo piano e RequestAccessAsync deve essere chiamato dal thread dell’interfaccia utente. L'app può accedere ai dati sulla posizione solo dopo che l'utente ha concesso all'app l'autorizzazione per la propria posizione.

  • Se la posizione non è essenziale per l'app, non accedervi fino a quando l'utente tenta di completare un'attività che lo richiede. Ad esempio, se un'app di social networking ha un pulsante "Accedi con la mia posizione", l'app non dovrebbe accedere alla posizione finché l'utente non fa clic sul pulsante. È possibile accedere immediatamente alla posizione, se necessario per la funzione principale dell'app.

  • Il primo uso dell'oggetto Geolocator deve essere eseguito nel thread principale dell'interfaccia utente dell'app in primo piano per attivare la richiesta di consenso all'utente. Il primo uso del Geolocator può essere la prima chiamata a getGeopositionAsync o la prima registrazione di un gestore per l'evento positionChanged.

  • Comunicare all'utente come verranno usati i dati sulla posizione.

  • Fornire l'interfaccia utente per consentire agli utenti di aggiornare manualmente la propria posizione.

  • Visualizzare un indicatore di stato o un anello durante l'attesa per ottenere i dati sulla posizione.

  • Visualizzazione di messaggi di errore o finestre di dialogo appropriati quando i servizi di posizione sono disabilitati o non sono disponibili.

    Se le impostazioni della posizione non consentono all'app di accedere alla posizione dell'utente, è consigliabile fornire un collegamento pratico alle impostazioni della privacy della posizione nell'app Impostazioni. Ad esempio, è possibile usare un controllo Hyperlink o chiamare il metodo LaunchUriAsync per avviare l'app Impostazioni dal codice usando ms-settings:privacy-location URI. Per maggiori informazioni, vedere Avviare l'app Impostazioni di Windows.

  • Cancellare i dati della posizione memorizzati nella cache e rilasciare il Geolocator quando l'utente disattiva l'accesso alle informazioni sulla posizione.

    Rilasciare l'oggetto Geolocator se l'utente disattiva l'accesso alle informazioni sulla posizione tramite Impostazioni. L'app riceverà quindi risultati ACCESS_DENIED per qualsiasi chiamata API di posizione. Se l'app salva o memorizza nella cache i dati sulla posizione, cancellare tutti i dati memorizzati nella cache quando l'utente revoca l'accesso alle informazioni sulla posizione. Fornire un modo alternativo per immettere manualmente le informazioni sulla posizione quando i dati sulla posizione non sono disponibili tramite i servizi di posizione.

  • Fornire l'interfaccia utente per riabilitare i servizi di posizione. Ad esempio, fornire un pulsante di aggiornamento che reinstanzia l'oggetto Geolocator e tenta di ottenere nuovamente le informazioni sulla posizione.

    Chiedere all'app di fornire l'interfaccia utente per riabilitare i servizi di posizione:

    • Se l'utente riabilita l'accesso alla posizione dopo la disabilitazione, non viene inviata alcuna notifica all'app. Lo status non cambia e non esiste alcun evento statusChanged. L'app dovrebbe creare un nuovo oggetto Geolocator e chiamare getGeopositionAsync per provare a ottenere i dati della posizione aggiornati o sottoscrivere di nuovo gli eventi positionChanged. Se lo stato indica che la posizione è stata riabilitata, cancellare qualsiasi interfaccia utente in base alla quale l'app ha precedentemente informato l'utente che i servizi di posizione sono stati disabilitati e rispondere in modo appropriato al nuovo stato.
    • L'app dovrebbe anche riprovare a ottenere i dati sulla posizione al momento dell'attivazione o quando l'utente tenta esplicitamente di usare funzionalità che richiedono informazioni sulla posizione o in qualsiasi altro momento appropriato per gli scenari.

Prestazioni

  • Usare richieste di posizione una tantum se l'app non deve ricevere gli aggiornamenti di posizione. Ad esempio, un'app che aggiunge un tag di posizione a una foto non deve ricevere gli eventi di aggiornamento della posizione. Deve invece richiedere la posizione usando getGeopositionAsync, come descritto in Ottenere la posizione corrente.

    Quando si effettua una richiesta di posizione una tantum, è necessario impostare i valori seguenti.

    • Specificare l'accuratezza richiesta dall'app impostando DesiredAccuracy o DesiredAccuracyInMeters. Vedere di seguito per consigli sull'uso di questi parametri
    • Impostare il parametro max age di GetGeopositionAsync per specificare per quanto tempo può essere stato ottenuto un percorso utile per l'app. Se l'app può usare una posizione di pochi secondi o minuti prima, l'app può ricevere una posizione quasi immediatamente e contribuire a risparmiare energia del dispositivo.
    • Impostare il parametro di timeout di GetGeopositionAsync. Questo è il tempo per cui l'app può attendere la restituzione di una posizione o di un errore. Si dovranno capire i compromessi tra velocità di risposta e accuratezza delle esigenze dell'app.
  • Usare una sessione di posizione continua quando sono necessari aggiornamenti frequenti della posizione. Usare gli eventi positionChanged e statusChanged per rilevare lo spostamento oltre una soglia specifica o per gli aggiornamenti continui della posizione man mano che si verificano.

    Quando si richiedono gli aggiornamenti della posizione, potresti voler specificare l'accuratezza richiesta dall'app impostando DesiredAccuracy o DesiredAccuracyInMeters. È inoltre necessario impostare la frequenza con cui sono necessari gli aggiornamenti della posizione, usando MovementThreshold o ReportInterval.

    • Specificare la soglia di spostamento. Alcune app necessitano di aggiornamenti della posizione solo quando l'utente si è spostato di una distanza elevata. Ad esempio, un'app che fornisce notizie locali o aggiornamenti meteo potrebbe non richiedere aggiornamenti della posizione, a meno che la posizione dell'utente non sia cambiata in una città diversa. In questo caso, si regola il movimento minimo necessario per un evento di aggiornamento della posizione impostando la proprietà MovementThreshold. Questo ha l'effetto di filtrare gli eventi PositionChanged. Questi eventi vengono generati solo quando la modifica nella posizione supera la soglia di spostamento.

    • Usare reportInterval che si allinea all'esperienza dell'app e riduce al minimo l'uso delle risorse di sistema. Ad esempio, un'app meteo potrebbe richiedere un aggiornamento dei dati solo ogni 15 minuti. La maggior parte delle app, oltre alle app di spostamento in tempo reale, non richiede un flusso di aggiornamenti della posizione altamente accurato e costante. Se l'app non richiede il flusso di dati più accurato possibile o richiede aggiornamenti raramente, impostare la proprietà ReportInterval per indicare la frequenza minima degli aggiornamenti della posizione necessari per l'app. L'origine della posizione può quindi risparmiare energia calcolando la posizione solo quando necessario.

      Le app che richiedono dati in tempo reale devono impostare ReportInterval a 0 per indicare che non è specificato alcun intervallo minimo. L'intervallo di report predefinito è 1 secondo o alla frequenza che l'hardware può supportare, a seconda di quale sia più breve.

      I dispositivi che forniscono dati sulla posizione possono tenere traccia dell'intervallo di report richiesto da app diverse e fornire report sui dati all'intervallo più piccolo richiesto. L'app con la massima necessità di precisione riceve quindi i dati necessari. È quindi possibile che il provider di percorsi generi aggiornamenti con una frequenza superiore rispetto alla richiesta dell'app, se un'altra app ha richiesto aggiornamenti più frequenti.

      Nota Non è garantito che l'origine della posizione rispetti la richiesta per l'intervallo di report specificato. Non tutti i dispositivi del provider di posizioni tengono traccia dell'intervallo di report, ma è comunque necessario specificarlo per quelli che lo fanno.

    • Per risparmiare energia, impostare la proprietà desiredAccuracy per indicare alla piattaforma di posizione se l'app necessita di dati con accuratezza elevata. Se nessuna app richiede dati di accuratezza elevata, il sistema può risparmiare energia non attivando provider GPS.

      • Impostare desiredAccuracy su HIGH per consentire al GPS di acquisire i dati.
      • Impostare desiredAccuracy su Predefinito e usare solo un modello di chiamata a impulso singolo per ridurre al minimo il consumo di energia se l'app usa informazioni sulla posizione esclusivamente per la destinazione degli annunci.

      Se l'app ha esigenze specifiche relative all'accuratezza, si può usare la proprietà DesiredAccuracyInMeters invece di usare DesiredAccuracy. Questo è particolarmente utile in Windows Phone, dove la posizione può in genere essere ottenuta in base a beacon cellulari, beacon Wi-Fi e satelliti. La selezione di un valore di accuratezza più specifico consentirà al sistema di identificare le tecnologie appropriate da usare con il consumo di energia più basso quando si fornisce una posizione.

      Ad esempio:

      • Se l'app sta ottenendo la posizione per l'ottimizzazione degli annunci, meteo, notizie e così via, un'accuratezza di 5000 metri è in genere sufficiente.
      • Se l'app visualizza offerte nelle vicinanze nel quartiere, un'accuratezza di 300 metri è in genere buona per fornire risultati.
      • Se l'utente sta cercando consigli per i ristoranti nelle vicinanze, è probabile che voglia ottenere una posizione all'interno di un blocco, quindi un'accuratezza di 100 metri è sufficiente.
      • Se l'utente sta tentando di condividere la propria posizione, l'app deve richiedere un'accuratezza di circa 10 metri.
    • Usare la proprietà Geocoordinate.accuracy se l'app ha requisiti di accuratezza specifici. Ad esempio, le app di spostamento devono usare la proprietà Geocoordinate.accuracy per determinare se i dati sulla posizione disponibili soddisfano i requisiti dell'app.

  • Prendere in considerazione il ritardo di avvio. La prima volta che un'app richiede i dati sulla posizione, potrebbe verificarsi un breve ritardo (1-2 secondi) durante l'avvio del provider di posizioni. Considera questa opzione nella progettazione dell'interfaccia utente dell'app. Ad esempio, è possibile evitare di bloccare altre attività in attesa del completamento della chiamata a GetGeopositionAsync.

  • Prendere in considerazione il comportamento in background. Se l'app non ha lo stato attivo, non riceverà gli eventi di aggiornamento della posizione mentre è sospesa in background. Se l'app tiene traccia degli aggiornamenti della posizione registrandoli, tenere presente questo problema. Quando l'app riprende lo stato attivo, riceve solo nuovi eventi. Non vengono visualizzati aggiornamenti che si sono verificati quando è inattivo.

  • Utilizzare sensori non elaborati e fusioni in modo efficiente. Esistono due tipi di sensori: raw e fusion.

    • I sensori grezzi (raw) includono accelerometro, giroscopio e magnetometro.
    • I sensori fusion includono orientamento, inclinometro e bussola. I sensori Fusion ottengono i dati dalle combinazioni dei sensori raw.

    Le API di Windows Runtime possono accedere a tutti questi sensori, ad eccezione del magnetometro. I sensori fusion sono più accurati e stabili dei sensori raw, ma usano più energia. È consigliabile usare i sensori giusti per lo scopo corretto. Per maggiori informazioni, vedere Sensori.

Standby connesso

  • Quando il PC è in stato di standby connesso, è sempre possibile creare un'istanza degli oggetti Geolocator. Tuttavia, l'oggetto Geolocator non troverà sensori da aggregare e pertanto le chiamate a GetGeopositionAsync andrà in time out dopo 7 secondi, listener eventi PositionChanged non verranno mai chiamati e listener eventi StatusChanged verranno chiamati una volta con lo stato NoData.

Indicazioni aggiuntive sull'uso

Rilevamento delle modifiche nelle impostazioni della posizione

L'utente può disattivare la funzionalità posizione usando le impostazioni di privacy della posizione nell'app Impostazioni.

  • Per rilevare quando l'utente disabilita o riabilita i servizi di posizione:
    • Gestire l'evento StatusChanged. La proprietà Status dell'argomento per l'evento StatusChanged ha il valore Disabled se l'utente disattiva i servizi di posizione.
    • Controllare i codici di errore restituiti da GetGeopositionAsync. e l'utente ha disabilitato i servizi di posizione, le chiamate a GetGeopositionAsync hanno esito negativo cn errore ACCESS_DENIED e la proprietà LocationStatus ha il valore Disabled.
  • Se si ha un'app per cui i dati sulla posizione sono essenziali, ad esempio un'app di mapping, assicurarsi di eseguire le operazioni seguenti:
    • Gestire l'evento PositionChanged per ottenere gli aggiornamenti se la posizione dell'utente cambia.
    • Gestire l'evento StatusChanged come descritto in precedenza per rilevare le modifiche apportate alle impostazioni della posizione.

Si noti che il servizio posizione restituirà i dati non appena diventano disponibili. Può prima restituire una posizione con un raggio di errore più grande e quindi aggiornare la posizione con informazioni più accurate man mano che diventa disponibile. Le app che visualizzano la posizione utente in genere vogliono aggiornare la posizione man mano che diventano disponibili informazioni più accurate.

Rappresentazioni grafiche della posizione

Chiedere all'app di usare Geocoordinate.accuracy per indicare chiaramente la posizione corrente dell'utente sulla mappa. Esistono tre bande principali per l'accuratezza: un raggio di errore di circa 10 metri, un raggio di errore di circa 100 metri e un raggio di errore maggiore di 1 chilometro. Usando le informazioni sull'accuratezza, è possibile assicurarsi che l'app visualizzi la posizione in modo accurato nel contesto dei dati disponibili. Per informazioni generali sull'uso del controllo mappa, vedere Visualizzare mappe con visualizzazioni 2D, 3D e Streetside.

  • Per un'accuratezza approssimativamente uguale a 10 metri (risoluzione GPS), la posizione può essere indicata da un punto o un pin sulla mappa. Con questa precisione, è possibile visualizzare anche le coordinate di latitudine-longitudine e l'indirizzo stradale.

    esempio di mappa visualizzata con accuratezza gps di circa 10 metri.

  • Per una precisione compresa tra 10 e 500 metri (circa 100 metri), la posizione viene generalmente ricevuta tramite la risoluzione Wi-Fi. La posizione ottenuta dal cellulare ha un'accuratezza di circa 300 metri. In questo caso, è consigliabile che l'app mostri un raggio di errore. Per le app che mostrano le direzioni in cui è necessario un punto centrale, tale punto può essere visualizzato con un raggio di errore che lo circonda.

    esempio di mappa visualizzata con accuratezza wi-fi di circa 100 metri.

  • Se l'accuratezza restituita è maggiore di 1 chilometro, probabilmente si ricevono informazioni sulla posizione alla risoluzione a livello di IP. Questo livello di accuratezza è spesso troppo basso per individuare un punto specifico su una mappa. L'app deve eseguire lo zoom avanti fino al livello della città sulla mappa o all'area appropriata in base al raggio dell'errore (ad esempio, livello di area).

    esempio di mappa visualizzata con accuratezza wi-fi di circa 1 chilometro.

Quando l'accuratezza della posizione passa da una banda di accuratezza a un'altra, fornire una transizione normale tra le diverse rappresentazioni grafiche. A tale scopo, è possibile:

  • Rendere l'animazione di transizione uniforme e mantenere la transizione veloce e fluida.
  • In attesa di alcuni report consecutivi per confermare la modifica dell'accuratezza, per evitare zoom indesiderati e troppo frequenti.

Rappresentazioni testuali della posizione

Alcuni tipi di app, ad esempio un'app meteo o un'app per le informazioni locali, richiedono modi per rappresentare la posizione in modo testuale in base alle diverse bande di accuratezza. Assicurarsi di visualizzare chiaramente la posizione e solo fino al livello di accuratezza fornito nei dati.

  • Per un'accuratezza approssimativamente uguale a 10 metri (risoluzione GPS), i dati sulla posizione ricevuti sono abbastanza accurati e quindi possono essere comunicati al livello del nome del quartiere. È anche possibile usare nome della città, stato o provincia e nome del paese o dell'area geografica.
  • Per un'accuratezza approssimativamente uguale a 100 metri (risoluzione Wi-Fi), i dati sulla posizione ricevuti sono moderatamente accurati e quindi consigliamo di visualizzare le informazioni fino al nome della città. Evitare di usare il nome del quartiere.
  • Per un'accuratezza maggiore di 1 chilometro (risoluzione IP), visualizzare solo lo stato o la provincia o il nome del paese o dell'area geografica.

Considerazioni sulla privacy

La posizione geografica di un utente fa parte dei dati personali. Il sito Web seguente fornisce indicazioni per la protezione della privacy degli utenti.