Table of Contents
Inleiding tot Locatie-gebaseerde herinneringen in iOS
Op locatie gebaseerde herinneringen transformeren een standaard mobiele applicatie in een contextbewuste assistent die tijdig meldingen geeft wanneer een gebruiker een bepaald geografisch gebied binnenkomt of verlaat. Van het herinneren van een gebruiker om een recept op te halen bij een apotheek om hen te informeren om een thuisalarm in te stellen bij het verlaten van het huis, deze functie verhoogt de dagelijkse productiviteit en betrokkenheid. In iOS biedt de combinatie van het Core Locatie]-raamwerk en het -gebruiksnotificaties[]-raamwerk een robuuste en privacybewuste basis voor het implementeren van dergelijke functionaliteit. Dit artikel biedt een uitgebreide, productie-ready gids voor het bouwen van locatie-gebaseerde herinneringen, die alles omvatten van machtigingen en geofence configuratie tot geavanceerde optimalisaties en teststrategieën.
Begrijpen van de kernlocatie en gebruikersmeldingen
De twee primaire iOS-kaders zijn betrokken Core Locatie en Gebruikersinformatie[. Core Locatie behandelt alle geografische tracking, inclusief regiomonitoring (geofences), diensten voor significante verandering van locatie en standaard GPS-positie-updates. UserNotifications beheert de planning, presentatie en het beheer van lokale en externe meldingen. Voor locatie-gebaseerde herinneringen gebruiken we lokale meldingen omdat ze volledig op het apparaat worden geactiveerd, geen netwerkverbinding vereisen en de privacy van de gebruiker respecteren.
Regiobewaking met is de meest eenvoudige aanpak. U definieert een cirkelvormig gebied (centrum coördinaat en straal) en geeft Core Locatie opdracht om uw app te informeren wanneer het apparaat de grens overschrijdt. Om deze gebeurtenissen te ontvangen terwijl de app op de achtergrond staat of beëindigd is, moet u een aanvraag indienen voor een locatievergunning (niet alleen ..in gebruik). Altijd-toestemming wordt geregeld door strikte richtlijnen voor App Store en moet worden gerechtvaardigd in de apps Info.plist strings en UI.
Toestemmingen instellen
Verzoek om een vergunning voor de locatie
Voordat locatiebewaking kan beginnen, moet uw app de gebruiker uitdrukkelijke toestemming vragen. iOS geeft een systeemprompt weer die de doelstring van uw bevat. Voor achtergrond regiomonitoring heb je nodig (iOS 11+) of ]. De code moet eerst bellen op de instantie:
let locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.requestAlwaysAuthorization()
Apple moedigt ontwikkelaars aan om het toestemmingsverzoek uit te stellen tot de gebruiker een context heeft. Doe niet] verzoeken altijd-toestemming bij de eerste lancering; in plaats daarvan, leg het voordeel uit voordat de prompt wordt getoond. Behandel ook het geval waarin de gebruiker aanvankelijk toestemming weigert door ze te leiden naar de Instellingen-app.
Verzoek om een vergunning voor aanmelding
Tegelijkertijd moet u toestemming vragen om meldingen weer te geven. Dit gebeurt via :
let center = UNUserNotificationCenter.current()
center.requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
// Handle response
}
Als de gebruiker geen toestemming voor kennisgeving geeft, overweeg dan om een alternatief aan te bieden (bijvoorbeeld in-app waarschuwingen) of uit te leggen hoe meldingen de ervaring verbeteren. Beide machtigingen zijn onafhankelijk . Een gebruiker kan een locatie toestaan, maar meldingen uitschakelen, of vice versa.
Geofences en regiobewaking instellen
Vaststelling van een circulaire regio
Een geofence wordt geïmplementeerd met behulp van . U levert een centrumcoördinaat (breedte en lengte) en een straal in meter. De minimale radius iOS betrouwbaar ondersteunt ongeveer 100 meter, hoewel testen op apparaten met goede GPS kan leiden tot kleinere radii. Geef aan of u wilt worden geïnformeerd bij binnenkomst, uitgang, of beide:
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)
De string moet uniek zijn per regio; deze wordt gebruikt om inkomende gebeurtenissen aan te passen. iOS ondersteunt maximaal 20 gelijktijdig bewaakte regio's per app. Als u meer nodig hebt, overweeg dan regio's te combineren of een significante veranderingslocatie te gebruiken om een meer korrelige controle te veroorzaken.
Toezicht op meerdere regio's
Vaak zult u veel herinneringen hebben (bijv. door de gebruiker gemaakte geofences). Store regio-identificaties in een lokale database (Core Data, Realm, or UserDefaults). Wanneer de app wordt gestart, herregistreer alle actieve regio's. Verwijder ook regio's die niet langer nodig zijn om binnen de 20-regio limiet te blijven.
// Remove regions when no longer needed
locationManager.stopMonitoring(for: region)
Monitor de -methode om gevallen te vangen waarbij de regiobewaking niet wordt ondersteund (bijvoorbeeld op oudere apparaten) of beperkt is door systeeminstellingen.
Gebeurtenissen in de regio
Wanneer een apparaat een geofence grens overschrijdt, roept Core Locatie één van twee gedelegeerde methoden aan: of . Uw implementatie moet de regio-identificatie verifiëren en vervolgens een lokale melding plannen. Voorbeeld:
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.")
}
Merk op dat deze gedelegeerde methoden worden aangeroepen, zelfs als uw app wordt opgeschort; iOS zal uw app op de achtergrond kort wakker maken. U hebt ongeveer 30 seconden om code uit te voeren voordat het systeem u opnieuw schorst. Gebruik die tijd om de melding (of andere logica) zo snel mogelijk in te plannen.
Behandeling State Restoration Na Herstart van de App
Nadat de app is beëindigd (bijv. gebruikershandhavers of het systeem recovers geheugen), worden regio's nog steeds gecontroleerd door het systeem. Echter, wanneer een gebeurtenis plaatsvindt en de app niet draait, iOS start uw app opnieuw op de achtergrond en levert hetzelfde gedelegeerde bericht. U moet ervoor zorgen dat uw apps initialisatiecode correct de delegeert en herstelt elke noodzakelijke toestand. Bewaar voldoende informatie in persistente opslag om de gebeurtenis zonder gebruikersinteractie te behandelen.
Lokale meldingen versturen
De inhoud van de kennisgeving aanmaken
Gebruik om de titel, het lichaam, het geluid en de aangepaste gegevens te definiëren:
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"]
U kunt ook een opnemen om aangepaste acties in te schakelen (bijv. .Snooze
Trigger en verzoek
Omdat we willen dat de melding onmiddellijk na het evenement in de regio wordt afgevuurd, gebruiken we een time-interval trigger met een zeer korte vertraging (1 seconde).
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)
}
}
Het gebruik van een unieke identificatie voorkomt dat eerdere meldingen worden overschreven. Als u een nog te melden melding wilt vervangen (bijv. het bericht bijwerken), gebruik dan dezelfde identificatiecode.
Geluid en badge aanpassen
U kunt een aangepaste geluidsbestand in uw bundel (moet minder dan 30 seconden) door het instellen van . Badge nummers worden ingesteld via (of verhoging op basis van UIApplication.shared.applicationIconBadgeNumber). Onthoud dat de badge alleen wordt gewist wanneer de gebruiker de app opent of u handmatig resetten.
Fout bij het hanteren en de batterij overwegingen
Vaak voorkomende fouten
De regionale monitoring kan om verschillende redenen mislukken:
- Niet ondersteund op apparaat . . Sommige oudere iPads of iPod-aanraakjes missen een cellulaire/GPS-chip. Controleer .
- Locatiediensten uitgeschakeld
- Authorisatie geweigerd
- De regiolimiet die is overschreden
Voer de gedelegeerde uit om de fout te registreren en de gebruiker op een gratievolle manier te informeren (bijv., . .Niet in staat om deze locatie te bewaken.
Optimalisatie van de batterij
Locatiebewaking is energie-intensief. Het systeem optimaliseert al de regiobewaking door gebruik te maken van mobiele toren en Wi-Fi-positionering, maar u kunt de impact verder verminderen:
- Alleen zoveel regio's als nodig is (onder de 20 blijven) monitoren.
- Gebruik grotere radii wanneer precisie niet cruciaal is (bv. 500m vs 50m).
- De regiobewaking uitschakelen wanneer de app de achtergrond invoert voor niet-gerelateerde taken (gebruik in passende levenscyclusoproep).
- Voor niet-kritische herinneringen, overwegen aanzienlijke locatie-service te gebruiken () die alleen updates verstrekt wanneer het apparaat aanzienlijk (500m of meer) beweegt en minder stroom verbruikt.
Testen van locatiegebaseerde herinneringen
Locatie in Xcode simuleren
Xcode
Tests van de schrijfeenheid voor regiologica
Isoleer de gedelegeerde methoden en meldingsplanning in testbare componenten. Mock de en met behulp van protocollen. Voorbeeld:
protocol RegionHandler {
func didEnterRegion(with identifier: String)
}
class MockNotificationCenter: UNUserNotificationCenter {
var addedRequest: UNNotificationRequest?
override func add(_ request: UNNotificationRequest, withCompletionHandler: (Error?) -> Void) {
addedRequest = request
}
}
Testen dat het binnenkomen van een regio de juiste melding titel en instantie, en dat fouten worden behandeld.
Checklist voor echte testen
- Test invoer- en exit-gebeurtenissen terwijl de app in voorgrond, achtergrond en beëindigd is.
- Controleer of meerdere overlappende regio's onafhankelijke meldingen veroorzaken.
- Controleer batterij afvoer over een aantal uur van monitoring.
- Test met locatiediensten uitgeschakeld, Wi-Fi uitgeschakeld en mobiele data uitgeschakeld.
- Zorg ervoor dat meldingen niet worden herhaald als de gebruiker binnen een korte tijd opnieuw dezelfde regio binnenkomt . Voer een .cool-down-periode uit met behulp van UserDefaults-tijdstempels.
Privacy en gebruikerservaring Beste praktijken
Transparantie en instemming
Gebruikers zijn steeds gevoeliger voor locatietracking. Vraag altijd het minimale niveau van toegang aan dat nodig is. Voor de meeste locatie-gebaseerde herinneringen is .altijd een autorisatie nodig voor achtergrondmonitoring, maar u kunt nog steeds uitleggen waarom. Geef een in-app scherm voordat het systeemprompt dat de functie beschrijft en hoe locatiegegevens worden gebruikt (bijv., .Wij controleren alleen uw locatie om u herinneringen te sturen wanneer u de aangewezen plaatsen in- of verlaten. Uw locatiegegevens worden nooit geüpload naar onze servers.
Gebruikers toestaan om herinneringen te beheren
Bied een UI aan waar gebruikers alle actieve herinneringen kunnen bekijken, zie het omheinde gebied op een kaart en verwijder herinneringen individueel. Laat ze ook tijdelijk alle herinneringen pauzeren (bijv. tijdens vakantie). Een herinnering verwijderen moet onmiddellijk bellen .
Feedback en lege staten
Wanneer geen herinneringen zijn ingesteld, toont u een duidelijke lege staat met een call-to-action ( .Tap + om een locatie herinnering toe te voegen . Als rechten worden geweigerd, toont u een bericht waarin wordt uitgelegd wat de gebruiker mist en een knop die naar instellingen verwijst.
Niet storen en kritische waarschuwingen
Op locatie gebaseerde meldingen mogen niet storend zijn. Respecteer de huidige Focusmodus van de gebruiker (Niet storen) . Het systeem onderdrukt automatisch meldingen wanneer deze ingeschakeld zijn. Vraag geen toestemming voor een "kritische waarschuwing" tenzij de herinnering echt dringend is (bijv. medicatie) en goedgekeurd door Apple.
Geavanceerde verbeteringen
iBeacon-gebaseerde triggers
Voor binnenprecisie, overwegen iBeacon variering () in plaats van geofences. Beacons bieden nauwkeurigheid tot op enkele meters. De setup is vergelijkbaar: definieer een bakengebied door UUID, grote en kleine waarden, controleer vervolgens op in-/uitgang en bereik voor nabijheid. iBeacon monitoring vereist niet altijd-authorisatie (wanneer in gebruik is genoeg), maar de impact van de batterij is vergelijkbaar.
Samenvoegen met Significant-Change Locatie
De locatie-updates worden geactiveerd door de wijzigingen van de celtoren ongeveer elke 500 meter. U kunt ze gebruiken om de lijst van nabijgelegen geofences te vernieuwen, zelfs wanneer het apparaat snel beweegt (bijvoorbeeld in een auto). Echter, entry/exit gebeurtenissen worden dan berekend door uw eigen logica in plaats van door het systeem dedicated regio monitoring. Dit is handig als u honderden regio's .. moet u een subset in het geheugen te houden op basis van de gebruiker huidige gebied.
Achtergrondtaken gebruiken voor pre-fetching
Als uw herinneringen netwerkgegevens vereisen (bijvoorbeeld openingstijden opslaan), kunt u een (ingevoerd in iOS 13) plannen om gegevens opportunistisch te vernieuwen. Maar wees voorzichtig om het niet te combineren met locatie gebeurtenissen om te voorkomen dat de gebruiker op de achtergrond te volgen voor niet-locatie doeleinden.
Meerdere meldingen uit dezelfde regio verwerken
Als een gebruiker op een regiogrens blijft staan, kunnen ze herhaalde ingang/uitschakeling-gebeurtenissen ontvangen. Implementeer een afkoeltimer (bijv. . . .Raak geen nieuwe melding voor deze regio gedurende minstens 5 minuten . Bewaar de laatste trigger timestamp in UserDefaults per regio-identificatie.
Conclusie
Door de monitoring van de kernlocaties te combineren met gebruikersinformatie, kunt u functies creëren die intuïtief en nuttig zijn. De sleutel tot succes is het respecteren van de privacy van de gebruiker, het optimaliseren van het batterijgebruik, het probleemopgeruimd beheren van fouten en het bieden van een schone interface voor het beheren van herinneringen. Naarmate iOS zich blijft ontwikkelen, zullen nieuwe mogelijkheden zoals (iOS 17+) de achtergrondmonitoring verder vereenvoudigen. Bouw uw implementatie op de hier beschreven basis en u zult een productie-ready, betrouwbaar locatie-gebaseerde herinneringssysteem leveren.
Voor meer informatie, raadpleeg de officiële Apple documentatie: