2016-08-02 31 views
2

Ich entwickle einen Code, der meine Position alle 10 Minuten und Erlösung in CoreData bekommen sollte. Wenn ich mit der conectavo-App in den Hintergrund gehe, kann xcode das Protokoll, auf dem der Dienst läuft, nicht sehen, aber wenn ich die Straßen betrete, wird er einfach nicht gespeichert oder gespeichert.Ort im Hintergrund funktioniert nicht

Dieser Teil meines Codes ist, dass dieser function.See speichert in codeData tun soll:

var saveLocationInterval = 60.0 

func applicationDidEnterBackground(application: UIApplication) { 
     UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler(nil) 
     self.timer = NSTimer.scheduledTimerWithTimeInterval(saveLocationInterval, target: self, selector: #selector(AppDelegate.saveLocation), userInfo: nil, repeats: true) 
     NSRunLoop.currentRunLoop().addTimer(self.timer, forMode: NSRunLoopCommonModes) 

     locationController.startUpdatingLocation() 
    } 

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
     saveLocation() 
    } 

func saveLocation(){ 
     print("======") 
     let logUser = NSEntityDescription.insertNewObjectForEntityForName("LOG_GPS", inManagedObjectContext: self.managedObjectContext) as! LOG_GPS 

     if locationController.location == nil{ 
      logUser.latitude = "" 
      logUser.longitude = "" 
     } else { 
      logUser.latitude = "\(locationController.location!.coordinate.latitude)" 
      logUser.longitude = "\(locationController.location!.coordinate.longitude)" 
     } 

     logUser.velocidade = userSpeed > 0 ? Int(userSpeed) : 0 
     logUser.address = "\(userSpeed)" 

     if _usuario.chave != nil { 
      logUser.chave_usuario = "\(_usuario.chave!)" 
     } 
     if _empresa.chave != nil { 
      logUser.chave_licenca = "\(_empresa.chave!)" 
     } 

     print("localizaçao salva no bd \(logUser.latitude)") 
     let date = NSDate() 
     let dateFormatter = NSDateFormatter() 
     dateFormatter.dateFormat = "dd/MM/yy HH:mm:ss" 
     let dateString = dateFormatter.stringFromDate(date) 
     logUser.data = dateString 
     do { 
      try self.managedObjectContext.save() 
     } catch { 
     } 
    } 

Ein weiterer großer Fehler in meinem Code kann ich nicht lösen, ist die Geschwindigkeit des Anwenders. Bei dem Verfahren bin versucht, die niedrige ich Ihre Geschwindigkeit in einer Variablen zu speichern und dann die Coredata speichern aber das ist mir immer einen negativen Wert zurück:

func locationManager(manager: CLLocationManager, didUpdateToLocation newLocation: CLLocation, fromLocation oldLocation: CLLocation) { 
     var speed: CLLocationSpeed = CLLocationSpeed() 
     speed = newLocation.speed 
     print(speed * 3.6) 
     userSpeed = speed * 3.6 
    } 

this is my background mode

+0

haben Sie UIBackgroundModes festgelegt? –

+0

ja, das mache ich! – breno

+0

Ich poste einen Screenshot – breno

Antwort

4

Mögliche Lösung 1

Sie benötigen einen Schlüssel in Ihrem Info.plist, der beschreibt, warum Ihre App Hintergrundort benötigt.

Gehen Sie zu Ihrem Info.plist, finden Sie den Bundle Version Schlüssel und klicken Sie auf die +, die angezeigt wird, wenn Sie den Mauszeiger darüber bewegen. Fügen Sie dann den Schlüssel NSLocationAlwaysUsageDescription hinzu, legen Sie ihn als Zeichenfolge fest und legen Sie den Wert wie gewünscht fest: "Wir benötigen Ihren Standort im Hintergrund, damit wir Ihren Standort mit Freunden teilen können."

Jetzt sollte Ihre App funktionieren. Wenn dies nicht der Fall ....

Mögliche Lösung 2 (wahrscheinlicher Lösung, wenn Sie wissen, was Sie tun)

Mit iOS 9 Apple es gemacht, so dass Anwendungen auf physischen Geräten eine Notwendigkeit spezielle Codezeile zum Ausführen von Standortdiensten im Hintergrund. Über die Veränderung wurde nicht viel berichtet (wenn überhaupt?), Aber ich habe es vor einiger Zeit verstanden, dies herauszufinden. Hier ist, was Sie tun müssen, um standortbezogene Dienste erhalten im Hintergrund auf physische Geräte wieder zu arbeiten:

In Ihrem Hauptstandort Tracking ViewDidLoad Ansicht Controller put ...

if #available(iOS 9.0, *) { 
    locationManager.allowsBackgroundLocationUpdates = true 
} else { 
    // You don't need anything else on earlier versions. 
} 

Dies wird (geheimnisvoll genug ist) wahrscheinlich Alles was Sie brauchen, um Ihr Problem zu lösen.

+0

Danke, ich mache das und jetzt werde ich einige Tests machen. Wenn es funktioniert, lebe ich hier. Aber danke trotzdem. – breno

+0

@breno Großartig. Lassen Sie es mich wissen, wenn es funktioniert, und achten Sie darauf, das Häkchen zu setzen, wenn es Ihr Problem behebt. – owlswipe

+0

Überlassen Sie es mir. Danke = D – breno