Share via


Linee guida per le app con funzionalità per i recinti virtuali

Nota

MapControl e i servizi per le mappe richiedono una chiave di autenticazione delle mappe denominata MapServiceToken. Per altre informazioni su come ottenere e impostare una chiave di autenticazione delle mappe, vedere Richiedere una chiave di autenticazione per le mappe.

API importanti

Seguire queste procedure consigliate per geofencing nell'app.

Consigli

  • Se l'app richiede l'accesso a Internet quando si verifica un evento Geofence, verificare la presenza di accesso a Internet prima di creare il recinto virtuale.

    • Se l'app non ha attualmente accesso a Internet, è possibile richiedere all'utente di connettersi a Internet prima di configurare il recinto virtuale.
    • Se l'accesso a Internet non è possibile, evitare di consumare l'energia necessaria per i controlli della posizione di geofencing.
  • Verificare la pertinenza delle notifiche di geofencing controllando il timestamp e la posizione corrente quando un evento recinto virtuale indica le modifiche a uno stato Entered o Exited. Per maggiori informazioni, vedere Controllo del timestamp e della posizione corrente più avanti. (#timestamp) di seguito per ulteriori informazioni.

  • Creare eccezioni per gestire i casi in cui un dispositivo non può accedere alle informazioni sulla posizione e inviare una notifica all'utente, se necessario. Le informazioni sulla posizione potrebbero non essere disponibili perché le autorizzazioni sono disattivate, il dispositivo non contiene una radio GPS, il segnale GPS è bloccato o il segnale Wi-Fi non è abbastanza forte.

  • In generale, non è necessario ascoltare gli eventi di recinto virtuale in primo piano e in background contemporaneamente. Tuttavia, se l'app deve ascoltare gli eventi di recinto virtuale sia in primo piano che in background:

    • Chiamare il metodo ReadReports per verificare se si è verificato un evento.
    • Annullare la registrazione del listener di eventi in primo piano quando l'app non è visibile all'utente e ripetere la registrazione quando diventa nuovamente visibile.

    Per esempi di codice e altre informazioni, vedere Listener in background e in primo piano.

  • Non usare più di 1000 recinti virtuali per app. Il sistema supporta effettivamente migliaia di recinti virtuali per app, è possibile mantenere buone prestazioni dell'app per ridurre l'utilizzo della memoria dell'app usando non più di 1000.

  • Non creare un recinto virtuale con un raggio inferiore a 50 metri. Se l'app deve usare un recinto virtuale con un raggio ridotto, consigliare agli utenti di usare l'app su un dispositivo con una radio GPS per garantire prestazioni ottimali.

Indicazioni aggiuntive sull'uso

Controllo del timestamp e della posizione corrente

Quando un evento indica una modifica a uno stato Entered o Exited, controllare sia il timestamp dell'evento che la posizione corrente. Diversi fattori, ad esempio il sistema non dispone di risorse sufficienti per avviare un'attività in background, l'utente che non tiene presente la notifica o il dispositivo in standby (in Windows), può influire quando l'evento viene effettivamente elaborato dall'utente. Ad esempio, può verificarsi la seguente sequenza:

  • L'app crea un recinto virtuale e monitora il recinto virtuale per gli eventi di immissione e uscita.
  • L'utente sposta il dispositivo all'interno del recinto virtuale, causando l'attivazione di un evento enter.
  • L'app invia una notifica all'utente che si trova ora all'interno del recinto virtuale.
  • L'utente era occupato e non noterà la notifica fino a 10 minuti dopo.
  • Durante il ritardo di 10 minuti, l'utente si è spostato all'esterno del recinto virtuale.

Dal timestamp è possibile indicare che l'azione si è verificata nel passato. Dalla posizione corrente è possibile vedere che l'utente è tornato all'esterno del recinto virtuale. A seconda della funzionalità dell'app, si potrebbe voler escludere questo evento.

Listener in background e in primo piano

In generale, l'app non deve restare in ascolto degli eventi Geofence sia in primo piano che in un'attività in background contemporaneamente. Il metodo più pulito per gestire un caso in cui potrebbero essere necessari entrambi è consentire all'attività in background di gestire le notifiche. Se si configurano listener di recinto virtuale in primo piano e in background, non esiste alcuna garanzia che verrà attivata per prima e quindi è sempre necessario chiamare il metodo ReadReports per verificare se si è verificato un evento.

Se si è configurato listener di recinto virtuale in primo piano e in background, è necessario annullare la registrazione del listener dell'evento in primo piano ogni volta che l'app non è visibile all'utente e registrare nuovamente l'app quando diventa nuovamente visibile. Ecco un esempio di codice che esegue la registrazione per l'evento visibilità.

    Windows.UI.Core.CoreWindow coreWindow;    

    // This needs to be set before InitializeComponent sets up event registration for app visibility
    coreWindow = CoreWindow.GetForCurrentThread();
    coreWindow.VisibilityChanged += OnVisibilityChanged;
 document.addEventListener("visibilitychange", onVisibilityChanged, false);

Quando la visibilità cambia, è possibile abilitare o disabilitare i gestori eventi in primo piano, come illustrato di seguito.

private void OnVisibilityChanged(CoreWindow sender, VisibilityChangedEventArgs args)
{
    // NOTE: After the app is no longer visible on the screen and before the app is suspended
    // you might want your app to use toast notification for any geofence activity.
    // By registering for VisibiltyChanged the app is notified when the app is no longer visible in the foreground.

    if (args.Visible)
    {
        // register for foreground events
        GeofenceMonitor.Current.GeofenceStateChanged += OnGeofenceStateChanged;
        GeofenceMonitor.Current.StatusChanged += OnGeofenceStatusChanged;
    }
    else
    {
        // unregister foreground events (let background capture events)
        GeofenceMonitor.Current.GeofenceStateChanged -= OnGeofenceStateChanged;
        GeofenceMonitor.Current.StatusChanged -= OnGeofenceStatusChanged;
    }
}
function onVisibilityChanged() {
    // NOTE: After the app is no longer visible on the screen and before the app is suspended
    // you might want your app to use toast notification for any geofence activity.
    // By registering for VisibiltyChanged the app is notified when the app is no longer visible in the foreground.

    if (document.msVisibilityState === "visible") {
        // register for foreground events
        Windows.Devices.Geolocation.Geofencing.GeofenceMonitor.current.addEventListener("geofencestatechanged", onGeofenceStateChanged);
        Windows.Devices.Geolocation.Geofencing.GeofenceMonitor.current.addEventListener("statuschanged", onGeofenceStatusChanged);
    } else {
        // unregister foreground events (let background capture events)
        Windows.Devices.Geolocation.Geofencing.GeofenceMonitor.current.removeEventListener("geofencestatechanged", onGeofenceStateChanged);
        Windows.Devices.Geolocation.Geofencing.GeofenceMonitor.current.removeEventListener("statuschanged", onGeofenceStatusChanged);
    }
}

Ridimensionamento dei recinti virtuali

Anche se il GPS può fornire informazioni sulla posizione più accurate, il recinto virtuale può anche usare Wi-Fi o altri sensori di posizione per determinare la posizione corrente dell'utente. Tuttavia, l'uso di questi altri metodi può influire sulle dimensioni dei recinti virtuali che è possibile creare. Se il livello di accuratezza è basso, la creazione di recinti virtuali di piccole dimensioni non sarà utile. In generale, è consigliabile non creare un recinto virtuale con un raggio inferiore a 50 metri. Inoltre, le attività in background del recinto virtuale vengono eseguite periodicamente solo in Windows; se si usa un piccolo recinto virtuale, c'è la possibilità di perdere completamente un evento Enter o Exit.

Se l'app deve usare un recinto virtuale con un raggio ridotto, consigliare agli utenti di usare l'app su un dispositivo con una radio GPS per garantire prestazioni ottimali.