App Crash während die Geo Location im Background aufgezeichnet wird

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • App Crash während die Geo Location im Background aufgezeichnet wird

    Hallo,

    ich will für mich eine private App machen wo ich einfach meinen mit dem Fahrrad gefahrenen Weg aufzeichne. Wenn ich die App offen lasse (also das Handy nicht sperre) funktioniert es einwandfrei. Sobald ich es sperre und 10 Sekunden später entsperre dann wird die Route auch noch richtig eingezeichnet. Wenn ich es allerdings zB. 40 Sekunden gesperrt lasse dann ist die App gecrasht und hat sich geschlossen. Warum ? Wie kann ich die Ursache herausfinden?

    [Blockierte Grafik: https://www.directupload.net/file/d/5345/i96msbrc_png.htm]Zusätzlich habe ich auch unter Capabilities -> Background Mode -> Location updates aktiviert und in der Info.plistfolgende Einträge eingetragen:
    • Privacy - Location Always and When In Use Usage Description
    • Privacy - Location When In Use Usage Description
    [Blockierte Grafik: https://www.directupload.net/file/d/5345/i96msbrc_png.htm]
    Hier der Code:

    Quellcode

    1. class ViewController: UIViewController, CLLocationManagerDelegate, MKMapViewDelegate{
    2. @IBOutlet weak var label: UILabel!
    3. @IBOutlet weak var mapView: MKMapView!
    4. @IBAction func start(_ sender: Any) {
    5. locationManager.startUpdatingLocation()
    6. }
    7. @IBAction func stop(_ sender: Any) {
    8. locationManager.stopUpdatingLocation()
    9. }
    10. let locationManager = CLLocationManager()
    11. var coordinates:[CLLocationCoordinate2D] = []
    12. var strSpeed:String = ""
    13. var strCourse:String = ""
    14. var gefahreneDistanz:Double = 0
    15. var informationArray:[String]?
    16. var index = 0
    17. override func viewDidLoad() {
    18. super.viewDidLoad()
    19. label.isHidden = false
    20. locationManager.delegate = self
    21. locationManager.desiredAccuracy = kCLLocationAccuracyBest
    22. locationManager.requestAlwaysAuthorization()
    23. mapView.delegate = self
    24. mapView.showsUserLocation = true
    25. }
    26. func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    27. for location in locations{
    28. strSpeed = String(format: "Deine Geschwindigkeit beträgt %.1f km/h", location.speed*3.6)
    29. strCourse = String(format: "Dein Kurs: %.1f Grad", location.course)
    30. informationArray = [strSpeed, strCourse]
    31. let span = MKCoordinateSpan.init(latitudeDelta: 0.008, longitudeDelta: 0.008)
    32. let region = MKCoordinateRegion.init(center: mapView.userLocation.coordinate, span: span)
    33. mapView.setRegion(region, animated: true)
    34. coordinates.append(location.coordinate)
    35. let numberOfLocations = coordinates.count
    36. if numberOfLocations > 5{
    37. var pointToConnect = [coordinates[numberOfLocations - 1], coordinates[numberOfLocations - 2]]
    38. let polyline = MKPolyline(coordinates: &pointToConnect, count: pointToConnect.count)
    39. mapView.addOverlay(polyline)
    40. let distanz = gefahreneDistanzInKm(count: numberOfLocations)
    41. label.text = String(format: "%.2f km/h --- ", location.speed*3,6) + distanz + " KM"
    42. }
    43. }
    44. }
    45. func gefahreneDistanzInKm(count:Int) -> String{
    46. let point1 = CLLocation(latitude: coordinates[count - 1].latitude, longitude: coordinates[count - 1].longitude)
    47. let point2 = CLLocation(latitude: coordinates[count - 2].latitude, longitude: coordinates[count - 2].longitude)
    48. gefahreneDistanz = gefahreneDistanz + (point1.distance(from: point2)/1000)
    49. return String(format: "%.2f", gefahreneDistanz)
    50. }
    51. func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
    52. if overlay is MKPolyline{
    53. let renderer = MKPolylineRenderer(overlay: overlay)
    54. renderer.strokeColor = UIColor.red
    55. renderer.lineWidth = 5
    56. return renderer
    57. }
    58. return MKOverlayRenderer()
    59. }
    60. override func didReceiveMemoryWarning() {
    61. super.didReceiveMemoryWarning()
    62. }
    63. }
    Alles anzeigen
    Bildschirmfoto 2019-01-27 um 14.28.10.png
  • Fehlt da nicht noch sowas wie “allowsBackgroundLocationUpdates” o. ä. für den CLLocationManager? Aber ich bin da kein Experte, mein Post hat einen anderen Grund:

    Überlege Dir bitte, die App nach Fertigstellung im Store zu veröffentlichen! Ich suche schon lange eine simple App, die beim Laufen einfach nur die Strecke aufzeichnet und Zeit / Entfernung ausgibt. Ohne Upload in irgendein Portal, ohne Cloud-Service, nicht als Abo (aber gerne mit einem einmaligen Preis). Momentan nutze ich noch „i.Run“, aber befürchte, dass es mit neuen iOS-Versionen bald seinen Dienst einstellt...

    Eine solche App steht daher auf meiner Todo-Liste ... einfach, weil ich sie brauche. Da würde ich auch gerne auf die Lösung eines anderen Entwicklers zurückgreifen :D

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Hallo Fabian,

    na ja, Du solltest eher nicht im Background das User Interface updaten, also weder die Karte zeichnen, noch Text-Labels mit Text füllen, sondern nur die empfangenen Daten speichern.

    Denn das ist mindestens unnötig, weil das sieht der User ja nicht, und zudem kostet es Rechenzeit, insbesondere für das Zeichnen der Karte! Über applicationWillEnterForeground, applicationDidEnterBackground u.ä. kannst Du Dir ja merken, ob Deine App gerade im Vordergrund läuft oder im Hintergrund ...

    Das könnte, muss aber nicht Dein Problem lösen ...

    BG
    Jörg