Hallo Zusammen und einen guten Morgen,
ich hab mir ein Projekt angelacht und versuche eine GeoCaching App in iOS umzusetzen, bisher klappt das auch soweit. Ziel der App ist es diverse Geocaches über eine API abzurufen und diese auf einer Karte darstellen zu lassen. Der Nutzer kann diese dann auswählen und Details sehen.
Bei der bisherigen Implementierung, bin ich jedoch hier und da auf ein bis zwei Probleme gestoßen.
1. Ich habe das Problem das ich den aktuellen Standort des Nutzers auf der Karte zwar sehe, jedoch nicht im Zentrum der Map. Sprich wenn ich die App starte zentriert die Map über den Hardgecodeden Ort (hier London) in der region-Variable meines LocationManagers. Wie behebe ich das, oder wo stehe ich hier auf dem Schlauch?
Alles anzeigen
Alles anzeigen
Alles anzeigen
2. Das Problem ist komplexer, ich versuche die Caches, aus einer API, in CoreData abzulegen und diese dann später als Annotations auf der Map darstellen zulassen. Jedoch versuche ich hier zu verstehen wo ich die Daten in CoreData abspeicher, mache ich das in meinem API-Request, dort wo die empfangenen JSON-Responses geparst werden?
Alles anzeigen
Ich habe mein Project mal als zip-Archiv angefügt. Ich habe auch ein Github Repository, würde das aber ungern öffentlich machen.
Sollte ich die zweite Frage in einem extra Thread packen, wenn ja werde ich das natürlich umgehend machen.
Vielen Dank für eure Hilfe.
Und sorry,das das nun doch so viel geworden ist
Grüße
cnc24
ich hab mir ein Projekt angelacht und versuche eine GeoCaching App in iOS umzusetzen, bisher klappt das auch soweit. Ziel der App ist es diverse Geocaches über eine API abzurufen und diese auf einer Karte darstellen zu lassen. Der Nutzer kann diese dann auswählen und Details sehen.
Bei der bisherigen Implementierung, bin ich jedoch hier und da auf ein bis zwei Probleme gestoßen.
1. Ich habe das Problem das ich den aktuellen Standort des Nutzers auf der Karte zwar sehe, jedoch nicht im Zentrum der Map. Sprich wenn ich die App starte zentriert die Map über den Hardgecodeden Ort (hier London) in der region-Variable meines LocationManagers. Wie behebe ich das, oder wo stehe ich hier auf dem Schlauch?
Quellcode
- import MapKit
- import CoreLocation
- final class LocationManager: NSObject, ObservableObject {
- @Published var location: CLLocation?
- @Published var region = MKCoordinateRegion(
- center: CLLocationCoordinate2D(latitude: 51.508150, longitude: -0.1300),
- span: MKCoordinateSpan(latitudeDelta: 0.5, longitudeDelta: 0.5)
- )
- private var hasSetRegion = false
- private let locationManager = CLLocationManager()
- override init() {
- super.init()
- self.locationManager.delegate = self
- self.locationManager.desiredAccuracy = kCLLocationAccuracyBest
- self.locationManager.distanceFilter = kCLDistanceFilterNone
- self.locationManager.requestWhenInUseAuthorization()
- self.locationManager.startUpdatingLocation()
- }
- }
- extension LocationManager: CLLocationManagerDelegate {
- func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
- if let location = locations.last {
- self.location = location
- print(location)
- if !hasSetRegion {
- self.region = MKCoordinateRegion(center: location.coordinate,
- span: MKCoordinateSpan(latitudeDelta: 0.5, longitudeDelta: 0.5))
- print(region)
- hasSetRegion = true
- }
- }
- }
- }
Quellcode
- import SwiftUI
- import MapKit
- struct MapModel: UIViewRepresentable {
- @Binding var region: MKCoordinateRegion
- var mapType : MKMapType
- var userTracking: MKUserTrackingMode
- var showsUserLocation: Bool
- var annotation: [Annotation]
- init(
- region: Binding<MKCoordinateRegion>,
- mapType: MKMapType,
- userTrackingMode: MKUserTrackingMode,
- showsUserLocation: Bool = true,
- annotation: [Annotation] = [Annotation(title: "test", subtitle: "subtest", coordinate: CLLocationCoordinate2D(latitude: 51.507222, longitude: -0.1275))]
- ){
- self._region = region
- self.mapType = mapType
- self.userTracking = userTrackingMode
- self.showsUserLocation = showsUserLocation
- self.annotation = annotation
- }
- func makeUIView(context: Context) -> MKMapView {
- let mapView = MKMapView()
- mapView.setRegion(region, animated: false)
- mapView.mapType = mapType
- mapView.showsUserLocation = showsUserLocation
- mapView.userTrackingMode = userTracking
- mapView.delegate = context.coordinator
- // Add annotation to the map
- for annotation in annotation {
- mapView.addAnnotation(annotation)
- }
- return mapView
- }
- func updateUIView(_ mapView: MKMapView, context: Context) {
- mapView.mapType = mapType
- // Update your region so that it is now your new region
- mapView.setRegion(region, animated: false)
- }
- func makeCoordinator() -> Coordinator {
- Coordinator(self)
- }
- class Coordinator: NSObject, MKMapViewDelegate {
- var parent: MapModel
- init(_ parent: MapModel) {
- self.parent = parent
- }
- func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
- guard annotation is MKPointAnnotation else { return nil }
- let identifier = "Annotation"
- guard let annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier) else {
- let annotationView = MKMarkerAnnotationView(annotation: annotation, reuseIdentifier: identifier)
- annotationView.canShowCallout = true
- return annotationView
- }
- annotationView.annotation = annotation
- return annotationView
- }
- func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) {
- DispatchQueue.main.async {
- self.parent.region = mapView.region
- }
- }
- }
- }
Quellcode
- import SwiftUI
- import MapKit
- struct MapView: View {
- @Environment(\.managedObjectContext) var viewContext
- var cacheAnnotation: [OpenCache]! = []
- @State var trackingMode: MKUserTrackingMode = .follow
- @ObservedObject private var managerDelegate = LocationManager()
- @State private var mapType: MKMapType = .standard
- private var apiResponses: () = NetworkManager.shared.getAllCaches { (results) in
- switch results {
- case .success(let response):
- print(response)
- break
- case .failure(let error):
- break
- }
- }
- var body: some View {
- VStack {
- MapModel(
- region: $managerDelegate.region,
- mapType: mapType,
- userTrackingMode: trackingMode,
- showsUserLocation: true
- ).edgesIgnoringSafeArea([.top])
- Picker("", selection: $mapType) {
- Text("Standard").tag(MKMapType.standard)
- Text("Satellite").tag(MKMapType.satellite)
- Text("Hybrid").tag(MKMapType.hybrid)
- }
- .pickerStyle(SegmentedPickerStyle())
- .opacity(0.5)
- Spacer()
- }
- }
- }
- struct MapView_Previews: PreviewProvider {
- static var previews: some View {
- MapView()
- }
- }
2. Das Problem ist komplexer, ich versuche die Caches, aus einer API, in CoreData abzulegen und diese dann später als Annotations auf der Map darstellen zulassen. Jedoch versuche ich hier zu verstehen wo ich die Daten in CoreData abspeicher, mache ich das in meinem API-Request, dort wo die empfangenen JSON-Responses geparst werden?
Quellcode
- ...
- URLSession.shared.dataTask(with: url) { data, response, error in
- // 1. Überprüfen ob Fehler vorliegt
- if error != nil {
- completion(.failure(.unableToComplete))
- return
- }
- // 2. Überprüfen ob die Response gültig ist
- guard let response = response as? HTTPURLResponse, response.statusCode == 200 else {
- completion(.failure(.invalidResponse))
- return
- }
- // 3. Überprüfen ob wir Daten erhalten haben
- guard let data = data else {
- completion(.failure(.invalidData))
- return
- }
- // Bearbeiten der empfangengen Daten
- // Decoder soll JSON-Daten in Swift-Objekte umwandeln
- do {
- let decoder = JSONDecoder()
- decoder.dateDecodingStrategy = .iso8601
- let cacheResponse = try decoder.decode(CacheResponseModel.self, from: data)
- // do something CoreData tasks here?
- completion(.success(cacheResponse))
- } catch {
- print(error)
- completion(.failure(.invalidData))
- }
- }.resume()
- ...
Ich habe mein Project mal als zip-Archiv angefügt. Ich habe auch ein Github Repository, würde das aber ungern öffentlich machen.
Sollte ich die zweite Frage in einem extra Thread packen, wenn ja werde ich das natürlich umgehend machen.
Vielen Dank für eure Hilfe.
Und sorry,das das nun doch so viel geworden ist
Grüße
cnc24