Table of Contents
Introduzione ai Reminders basati sulla posizione in iOS
I promemoria basati sulla posizione trasformano un'applicazione mobile standard in un assistente di contesto che fornisce le notifiche tempestive proprio quando un utente entra o lascia un'area geografica definita. Da ricordare a un utente di raccogliere una prescrizione quando vicino a una farmacia per avvisare loro di impostare un allarme casa quando si lascia la casa, questa funzione migliora la produttività e l'impegno quotidiano.
Comprendere la posizione centrale e le notifiche degli utenti
I due principali framework iOS coinvolti sono ] Posizione di Core] e []]Notificazioni di utenti[[]]. La posizione centrale gestisce tutti i tracciamenti geografici, incluso il monitoraggio della regione (geofences), i servizi di localizzazione di cambiamento significativo e gli aggiornamenti di posizione GPS standard.
Il monitoraggio della regione con è l’approccio più semplice. Definisci un’area circolare (centro coordinate e raggio) e istruisci la posizione centrale per informare la tua app quando il dispositivo attraversa il confine. Per ricevere questi eventi mentre l’applicazione è in background o terminata, è necessario richiedere “sempre”]] autorizzazione di localizzazione (non solo “quando in uso”).
Impostazione delle autorizzazioni
Richiesta di autorizzazione della posizione
Prima che qualsiasi monitoraggio della posizione possa iniziare, la tua app deve ottenere il permesso esplicito dell'utente. iOS visualizza un prompt del sistema che include la stringa di scopo dal tuo . Per il monitoraggio della regione di sfondo, è necessario (iOS 11+) o ]. Il codice dovrebbe prima chiamare ] sull'istanza :
let locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.requestAlwaysAuthorization()
Apple incoraggia gli sviluppatori a differire la richiesta di autorizzazione fino a quando l'utente non ha contesto.[]non[]] richiedere sempre-autorizzazione al primo lancio; invece, spiegare il beneficio prima di mostrare il prompt.
Richiesta di autorizzazione alla notifica
Contemporaneamente, è necessario richiedere il permesso di visualizzare le notifiche. Questo viene fatto tramite :
let center = UNUserNotificationCenter.current()
center.requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
// Handle response
}
Se l'utente nega il permesso di notifica, considera l'offerta di un'alternativa (ad esempio, avvisi in-app) o spiega come le notifiche migliorano l'esperienza. Entrambe le autorizzazioni sono indipendenti – un utente potrebbe consentire la posizione ma disabilitare le notifiche, o viceversa.
Configurazione di Geofences e Monitoraggio delle Regioni
Definizione di una Regione Circolare
Una geofence viene implementata utilizzando . Fornite una coordinata centrale (latitudine e longitudine) e un raggio in metri. Il raggio minimo che iOS supporta in modo affidabile è di circa 100 metri, anche se i test su dispositivi con un buon GPS possono produrre radii più piccoli. Specificare se si desidera essere informati sull'ingresso, l'uscita, o entrambi:
let center = CLLocationCoordinate2D(latitude: 37.7749, longitude: -122.4194)
let region = CLCircularRegion(center: center, radius: 150, identifier: "OfficeRegion")
region.notifyOnEntry = true
region.notifyOnExit = true
locationManager.startMonitoring(for: region)
La stringa deve essere unica per regione; è utilizzata per abbinare gli eventi in arrivo. iOS supporta un massimo di 20 regioni contemporaneamente monitorate per app. Se avete bisogno di più, considerare la combinazione delle regioni o utilizzando significativa posizione di cambiamento per attivare un controllo più granulare.
Monitoraggio delle regioni più numerose
Spesso si avrà molti promemoria (ad esempio, geofences create dall'utente). Identificatori di regione di memorizzazione in un database locale (Core Data, Realm, o UserDefaults). Quando l'app lancia, re-registra tutte le regioni attive.
// Remove regions when no longer needed
locationManager.stopMonitoring(for: region)
Monitorare il metodo delegata per catturare i casi in cui il monitoraggio della regione non è supportato (ad esempio, su dispositivi più vecchi) o è limitato dalle impostazioni del sistema.
Manipolazione Regione Eventi
Quando un dispositivo attraversa un confine di geofence, Core Location chiama uno dei due metodi delegativi: o . La tua implementazione dovrebbe verificare l'identificatore della regione e quindi pianificare una notifica locale.
func locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion) {
guard region.identifier == "OfficeRegion" else { return }
scheduleNotification(title: "Welcome to Office", body: "Don't forget to scan your badge.")
}
Nota che questi metodi delegate sono chiamati anche se la tua applicazione è sospesa; iOS sveglierà brevemente la tua app in background. Hai circa 30 secondi per eseguire il codice prima che il sistema ti sospenda di nuovo.
Gestione del ripristino dello stato dopo il riavvio dell'app
Dopo la chiusura dell’app (ad esempio, i comandi di forza utente o la memoria del sistema), le regioni sono ancora monitorate dal sistema. Tuttavia, quando si verifica un evento e l’app non è in esecuzione, iOS rilancia la tua app in background e consegna lo stesso messaggio del delegato. È necessario garantire che il codice di inizializzazione della tua app configura correttamente il delegato e ripristina qualsiasi evento di archiviazione persistente.
Invio di notifiche locali
Creazione del Contenuto di notifica
Usa per definire il titolo, il corpo, il suono e i dati personalizzati:
let content = UNMutableNotificationContent()
content.title = "Reminder"
content.body = "You're near the store! Don't forget to buy groceries."
content.sound = .default
content.userInfo = ["regionID": "StoreRegion"]
Puoi anche includere un per abilitare azioni personalizzate (ad esempio, “Snooze” o “Mark as Done”).
Trigger e richiesta
Poiché vogliamo che la notifica venga messa a fuoco immediatamente dopo l'evento della regione, usiamo un trigger di intervallazione temporale con un ritardo molto breve (1 secondo).
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 1, repeats: false)
let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request) { error in
if let error = error {
// Log error (e.g., notification not added)
}
}
Se si desidera sostituire una notifica in attesa (ad esempio, aggiornare il messaggio), utilizzare lo stesso identificatore.
Personalizzando suono e cattivo
È possibile fornire un file audio personalizzato nel vostro bundle (deve essere meno di 30 secondi) impostando . I numeri di Badge sono impostati tramite (o incremento basato su UIApplication.shared.applicaIconBadgeNumber). Ricorda che il badge è cancellato solo quando l'utente apre l'app o si ripristina manualmente.
Gestione degli errori e considerazioni sulla batteria
Errori comuni
Il monitoraggio della regione può fallire per diversi motivi:
- Non supportato sul dispositivo[[] – alcuni iPad più vecchi o iPod touchs non hanno un chip cellulare/GPS.
- I servizi di localizzazione disabilitati – possono restituire false.
- ] L'autenticazione nega[] – è ] o .
- Limitazione di regione estratta[] – se si tenta di monitorare più di 20 regioni, fallirà.
Implementare il delegare di registrare l'errore e informare l'utente con grazia (ad esempio, “Impossibile monitorare questa posizione”).
Ottimizzazione della batteria
Il monitoraggio della posizione è molto intenso e il sistema ottimizza già il monitoraggio della regione utilizzando la torre cellulare e il posizionamento Wi-Fi quando possibile, ma è possibile ridurre ulteriormente l'impatto:
- Monitorare solo quante regioni necessiti (mantenere sotto i 20 anni).
- Utilizzare radii più grandi quando la precisione non è critica (ad esempio, 500m vs 50m).
- Disattivare il monitoraggio delle regioni quando l'applicazione entra in background per compiti non correlati (utilizzare in app di callbacks del ciclo di vita appropriati).
- Per i promemoria non critici, considerare l'utilizzo di significativa sostituzione del servizio di localizzazione[[ [[[]]]]) che fornisce aggiornamenti solo quando il dispositivo si muove in modo significativo (500m o più) e consuma meno energia.
Testare i ripetitori basati sulla posizione
Simulazione di posizione in Xcode
Il Simulatore di Xcode consente di simulare le modifiche della posizione. Utilizzare la funzione "Simulare Location" (Debug > Simula posizione) e scegliere un file GPX o un'unità di autostrada. È inoltre possibile impostare manualmente le coordinate tramite il pulsante "Location" nella barra di debug. Tuttavia, notare che il monitoraggio della regione di sfondo non funziona nel simulatore per tutti gli scenari; si consiglia di testare su un dispositivo fisico.
Test unità di scrittura per la logica della regione
Isolare i metodi delegata e la programmazione delle notifiche in componenti testabili.
protocol RegionHandler {
func didEnterRegion(with identifier: String)
}
class MockNotificationCenter: UNUserNotificationCenter {
var addedRequest: UNNotificationRequest?
override func add(_ request: UNNotificationRequest, withCompletionHandler: (Error?) -> Void) {
addedRequest = request
}
}
Test che entrano in una regione produce il titolo e il corpo di notifica corretto, e che gli errori vengono maneggiati.
Lista di controllo di test reali
- Test di entrata e uscita eventi mentre l'app è in primo piano, sfondo, e terminato.
- Verificare che più regioni sovrapposte attivano notifiche indipendenti.
- Controllare lo scarico della batteria in diverse ore di monitoraggio.
- Test con servizi di localizzazione disabilitati, Wi-Fi off e dati cellulari off.
- Assicurare che i prompt delle notifiche non vengano ripetuti se l'utente rientri nella stessa regione entro un breve periodo di tempo – implementare un periodo di “cool-down” utilizzando timestamp UserDefaults.
Privacy e Esperienza dell'utente Migliori Pratiche
Trasparenza e consenso
Per la maggior parte dei promemoria basati sulla posizione, è necessario un’autorizzazione “sempre” per il monitoraggio di sfondo, ma è ancora possibile spiegare perché. Fornire uno schermo in-app prima del prompt del sistema che descrive la funzionalità e come vengono utilizzati i dati di localizzazione (ad esempio, “Siamo monitorati solo la posizione per inviare i promemoria quando si entra o si lascia posti designati.
Permettere agli utenti di gestire i Reminders
Offrire un'interfaccia utente in cui gli utenti possono visualizzare tutti i promemoria attivi, vedere l'area geofenced su una mappa e eliminare i promemoria singolarmente. Inoltre, lasciateli temporaneamente mettere in pausa tutti i promemoria (ad esempio, durante la vacanza).
Feedback e Stati vuoti
Quando non vengono impostati promemoria, mostra uno stato vuoto chiaro con una chiamata-to-action (“Tap + per aggiungere un promemoria di posizione”). Se le autorizzazioni sono negate, visualizza un messaggio che spiega ciò che manca all'utente e un pulsante che collega alle impostazioni.
Non disturbare e gli avvisi critici
Rispetta la modalità Focus corrente dell'utente (Do Not Disturb) – il sistema sopprime automaticamente le notifiche quando abilitato. Non richiedere il permesso di “critical alert” a meno che il promemoria non sia veramente urgente (ad esempio, il farmaco) e approvato da Apple.
Miglioramenti avanzati
IBeacon-Based Triggers
Per la precisione interna, prendere in considerazione l'utilizzo di iBeacon range ([[]) invece di geofences. I Beacons forniscono precisione fino a pochi metri. La configurazione è simile: definire una regione beacon da UUID, valori principali e minori, quindi monitorare per l'ingresso/uscita e anche la gamma per la prossimità.
Combinando con significativo-Change Location
Gli aggiornamenti significativi della posizione di cambio sono attivati da modifiche della torre cellulare di circa 500 metri. È possibile utilizzare per aggiornare l'elenco delle geofences vicine anche quando il dispositivo si sta muovendo velocemente (ad esempio, in un'auto). Tuttavia, gli eventi di entrata/uscita sono poi calcolati dalla propria logica piuttosto che dal monitoraggio della regione dedicata del sistema.
Utilizzo di compiti di sfondo per pre-fetching
Se i tuoi promemoria richiedono dati di rete (ad esempio, memorizzare le ore di apertura), è possibile pianificare un [ (introdotto in iOS 13) per aggiornare i dati opportunisticamente.
Gestione di più notifiche dalla stessa regione
Se un utente si trova in un limite di regione, potrebbe ricevere ripetuti eventi di entrata/uscita.Attuazione di un timer di aggiornamento (ad esempio, “Non attivare un'altra notifica per questa regione per almeno 5 minuti”).
Conclusioni
Grazie alla combinazione di monitoraggio della regione di Core Location con UserNotifications, puoi creare funzionalità che ti sentano intuitive e disponibili. La chiave per il successo è nel rispetto della privacy degli utenti, nell'ottimizzazione dell'utilizzo della batteria, nella gestione degli errori con grazia e nella fornitura di un'interfaccia pulita per la gestione dei promemoria.
Per ulteriori informazioni, consultare la documentazione ufficiale di Apple: