Last active
November 13, 2024 09:55
-
-
Save ajayjapan/f484c35d78198da13f726c35a4fa3a17 to your computer and use it in GitHub Desktop.
Here App Region Monitoring and Notification Trigger Logic
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// MARK: - Significant location change montioring logic | |
// Called at launch of application if permission is already granted | |
func startMonitoringSignificantLocationChanges() { | |
locationManager.startMonitoringSignificantLocationChanges() | |
} | |
// Called by location manager if there is a significant location change | |
func locationManager(_ manager: CLLocationManager, | |
didUpdateLocations locations: [CLLocation]) { | |
guard let latestLocation = locations.last else { | |
// No location found | |
return | |
} | |
self.latestLocation = latestLocation | |
self.updateTrackedPlaces(coordinate: latestLocation.coordinate) | |
} | |
func updateTrackedPlaces(coordinate: CLLocationCoordinate2D) { | |
// Fetches new places | |
dataStore.retrievePlaces(latitude: coordinate.latitude, longitude: coordinate.longitude) { [unowned self] (success, data, count) in | |
if self.authorized { | |
// Track the new places | |
self.trackPlaces(places: data) | |
} | |
} | |
} | |
func trackPlaces(places: [Place]) { | |
// Removes all the currently monitored regions | |
self.removeAllMonitoredRegions() | |
// Saves the new places in our place data store | |
PlaceManager.shared.savePlaces(places: places) | |
for place in places { | |
// Starts monitoring the new places | |
self.locationManager.startMonitoring(for: place.region()) | |
} | |
} | |
// MARK: - Region montioring logic | |
func locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion) { | |
guard let region = region as? CLCircularRegion else { | |
// region type was not valid | |
return | |
} | |
enteredRegion(region) | |
} | |
func enteredRegion(_ region: CLCircularRegion) { | |
if !canTriggerNotification(for: region) { | |
return | |
} | |
let identifier = region.identifier | |
// Retrieve place from data store | |
guard let place = PlaceManager.shared.placeForIdentifier(identifier) else { | |
// Could not find place with that identifier | |
return | |
} | |
triggerNotificationForPlace(place) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment