Hallo Zusammen.
Ich möchte folgendes verwirklichen:
Ich habe in einem Array Suchbegriffe für GeoLocations gespeichert, die ich gerne über Geofence überwachen möchte.
Da Geofence Funktionalität auf 20 Regionen pro App begrenzt sind, speichere ich die initial Location beim starten der App und führe einmal eine MKLocalSearchRequest für jeden Begriff aus.
Vor jeder Durchführung einer MKLocalSearchRequest lösche ich die alten mit Geofence überwachten Regionen und alle ClCircularRegionOverlays.
Über die response der MKLocalSearchRequest erhalte ich dann die gesuchten Locations als MKMapItem.
Über eine Schleife prüfe ich dann die Distanz zur aktuellen User Position und lege für die am nächsten gelegenen Suchergebnisse neue Geofence Regionen fest.
Dabei überwache ich nur die 5 am nächsten liegenden Ergebnisse.
Wenn der User sich um eine Distanz > meiner MapSpan bewegt, führe ich erneut eine MKLocalSearchRequest aus.
Mein Problem ist, dass meine CLCircularRegionOverlays nicht auf der Map gezeichnet werden.
Vielleicht kann jemand direkt sehen woran das liegen kann?
In der ViewDidLoad()
Hier der Teil in dem ich die Geofence Regionen Überwachung festlege:
In der LocationManager DidStartMonitoringForRegion delegate Funktion füge ich die MKCircle als Overlay zur Map hinzu:
In der mapView RendererForOverlay delegate Funktion sollte der Overlay dann gezeichnet werden:
Alles anzeigen
Laut meinem Log werden meine Funktionen auch ausgeführt aber ich sehe keinen Overlay:
Ich möchte folgendes verwirklichen:
Ich habe in einem Array Suchbegriffe für GeoLocations gespeichert, die ich gerne über Geofence überwachen möchte.
Da Geofence Funktionalität auf 20 Regionen pro App begrenzt sind, speichere ich die initial Location beim starten der App und führe einmal eine MKLocalSearchRequest für jeden Begriff aus.
Vor jeder Durchführung einer MKLocalSearchRequest lösche ich die alten mit Geofence überwachten Regionen und alle ClCircularRegionOverlays.
Über die response der MKLocalSearchRequest erhalte ich dann die gesuchten Locations als MKMapItem.
Über eine Schleife prüfe ich dann die Distanz zur aktuellen User Position und lege für die am nächsten gelegenen Suchergebnisse neue Geofence Regionen fest.
Dabei überwache ich nur die 5 am nächsten liegenden Ergebnisse.
Wenn der User sich um eine Distanz > meiner MapSpan bewegt, führe ich erneut eine MKLocalSearchRequest aus.
Mein Problem ist, dass meine CLCircularRegionOverlays nicht auf der Map gezeichnet werden.
Vielleicht kann jemand direkt sehen woran das liegen kann?
In der ViewDidLoad()
Hier der Teil in dem ich die Geofence Regionen Überwachung festlege:
Quellcode
- private func MonitoreCircularRegion(mapItem: MKMapItem){
- DispatchQueue.main.async {
- let region = CLCircularRegion(center: mapItem.placemark.coordinate, radius: CLLocationDistance(self.radiusToMonitore), identifier: "\(UUID().uuidString)\("SB_")\(mapItem.name!)")
- self.locationManager.startMonitoring(for: region)
- NSLog("Monitored Regions: \(self.locationManager.monitoredRegions.count)")
- NSLog("MapSpan: \(self.mapSpan)")
- NSLog("Start monitoring for Region: %A", region)
- }
- }
In der LocationManager DidStartMonitoringForRegion delegate Funktion füge ich die MKCircle als Overlay zur Map hinzu:
Quellcode
- func locationManager(_ manager: CLLocationManager, didStartMonitoringFor region: CLRegion) {
- NSLog("Started monitoring for Region: \(region.identifier)")
- NSLog("Monitored Regions: \(locationManager.monitoredRegions.count)")
- // Add region overlay circel
- if let circularRegion = region as? CLCircularRegion{
- let circle = MKCircle(center: circularRegion.center, radius: circularRegion.radius)
- self.MapView.add(circle)
- NSLog("Adding circular Overlay")
- }
- }
Quellcode
- func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
- guard let circleOverlay = overlay as? MKCircle else {
- return MKOverlayRenderer()
- }
- NSLog("Drawing Circular Overlay")
- let circleRenderer = MKCircleRenderer(circle: circleOverlay)
- circleRenderer.strokeColor = UIColor.red
- circleRenderer.fillColor = UIColor.red
- circleRenderer.alpha = 1
- circleRenderer.lineWidth = 2
- circleRenderer.setNeedsDisplay()
- return circleRenderer
- }
Laut meinem Log werden meine Funktionen auch ausgeführt aber ich sehe keinen Overlay:
Quellcode
- 2017-08-12 15:57:50.739271+0200 ShoppingBuddy[6199:2037589] Drawing Circular Overlay
- 2017-08-12 15:57:50.739426+0200 ShoppingBuddy[6199:2037589] Adding circular Overlay
- 2017-08-12 15:57:50.744723+0200 ShoppingBuddy[6199:2037589] Started monitoring for Region: 45DD4450-4018-4822-A68F-44F034342EA4SB_Aldi
- 2017-08-12 15:57:50.746293+0200 ShoppingBuddy[6199:2037589] Monitored Regions: 8
- 2017-08-12 15:57:50.746384+0200 ShoppingBuddy[6199:2037589] Drawing Circular Overlay
- 2017-08-12 15:57:50.746520+0200 ShoppingBuddy[6199:2037589] Adding circular Overlay
- 2017-08-12 15:57:50.748352+0200 ShoppingBuddy[6199:2037589] Started monitoring for Region: 8C588EFE-3EB7-4A46-891D-DD997821520CSB_Aldi
- 2017-08-12 15:57:50.749642+0200 ShoppingBuddy[6199:2037589] Monitored Regions: 8
- 2017-08-12 15:57:50.749709+0200 ShoppingBuddy[6199:2037589] Drawing Circular Overlay
- 2017-08-12 15:57:50.749801+0200 ShoppingBuddy[6199:2037589] Adding circular Overlay