2016-09-11 4 views
2

Hallo ich wollte den Standort des Benutzers erhalten, auch wenn die App im Hintergrund ist, dann wollte ich diese Informationen auf die db hochladen und wenn der Benutzer die App erneut ausführt, wird es ihm alle Orte anzeigen, die er besucht hat. So las ich den Artikel https://www.raywenderlich.com/92428/background-modes-ios-swift-tutorial und tat alles, was der Autor sagte In Funktionen, die ich Hintergrundmodi Standortaktualisierungen hinzugefügt habe, setze ich auch in Info.plist Anwendung läuft nicht im Hintergrund zu NEIN, aber meine App läuft immer noch nicht im Hintergrund, was sein könnte das Problem?So rufen Sie locationManager didUpdateToLocation vom Hintergrund ab?

import UIKit 
import CoreLocation 
import MapKit 



class ViewController: UIViewController, CLLocationManagerDelegate { 
    var i = 0 


    @IBOutlet var map: MKMapView! 
    var backendless = Backendless.sharedInstance() 
    lazy var locationManager: CLLocationManager = { 
     let locationManager = CLLocationManager() 
     locationManager.desiredAccuracy = kCLLocationAccuracyBest 
     locationManager.delegate = self 
     locationManager.requestAlwaysAuthorization() 
     locationManager.distanceFilter = kCLDistanceFilterNone 
     return locationManager 
    }() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     locationManager.startUpdatingLocation() 
     getLocations() 
     self.map.showsUserLocation = true 

     // Do any additional setup after loading the view, typically from a nib. 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    //MARK: -LocationManagerDelegate 
    //func locationMana 
    func locationManager(manager: CLLocationManager, didUpdateToLocation newLocation: CLLocation, fromLocation oldLocation: CLLocation) { 
     let loc = MKPointAnnotation() 
     loc.coordinate = newLocation.coordinate 

     savelocation(loc.coordinate.longitude, latitude: loc.coordinate.latitude) 
     //loc.coordinate.latitude 
     //map.showAnnotations(loc, animated: true) 

    } 
    func savelocation(longitude: Double, latitude: Double){ 
     print("I work \(i)") 
     i++ 
     let loc1 = locations() 
     loc1.latitude = String(latitude) 
     loc1.longitude = String(longitude) 
     // print(loc1.latitude) 
     // print(loc1.longitude) 
     let datastore = backendless.data.of(locations.ofClass()) 
     var error: Fault? 
     let result = datastore.save(loc1, fault: &error) as? locations 
     if error == nil{ 
      print("data was saved") 
     }else{ 
      print("data was not saved") 
     } 
    } 
    func callAlert(message:String!){ 
     let alertController=UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.Alert) 
     let OKButton=UIAlertAction(title: "OK", style: .Default, handler: nil) 
     alertController.addAction(OKButton) 
     self.presentViewController(alertController, animated: true, completion: nil) 
    } 
    func getLocations(){ 
     var arr = [MKPointAnnotation]() 
     //var temp: MKPointAnnotation! 
     let dataStore = Backendless.sharedInstance().data.of(locations.ofClass()) 
     var error: Fault? 
     let result = dataStore.findFault(&error) 
     if error == nil{ 
      let locs = result.getCurrentPage() 
      //  print(cities) 
      let locs1 = locs as! [locations] 
      if locs1.count - 1 >= 0{ 
       for index in 0...locs1.count - 1{ 
        let temp = MKPointAnnotation() 
        temp.coordinate.latitude = Double(locs1[index].latitude!)! 
        temp.coordinate.longitude = Double(locs1[index].longitude!)! 
        arr.append(temp) 
       } 
       self.map.addAnnotations(arr) 
      } 
     }else{ 
      self.callAlert("There is an error retrieving data") 
     } 

    } 


} 

Ich habe auch versucht AppDelegate applicationDidEnterBackground Methode zu ändern, aber ich weiß nicht, wie von Hand, dass die Methode aufzurufen. Irgendeine Hilfe? Vielen Dank. :) Ps. Ich weiß, das ist illegal und App sollte es selbst anrufen, aber ich sehe nicht, wie es anders geht

+0

Ich habe eine ähnliche App, die gut funktioniert. Ihr Code sieht gut aus - haben Sie "Privacy - Location Always Usage Beschreibung" ('NSLocationAlwaysUsageDescription') in Ihrer info.plist? – Grimxn

+0

Ja, ich habe das –

Antwort

0

Sie scheinen Ihre locationManager als eine lazy var eingerichtet haben, und ich nehme an, es wird bei diesem Aufruf initialisiert : locationManager.startUpdatingLocation(). Sie sollten diese Methode implementieren Updates starten statt:

func locationManager(manager: CLLocationManager, 
        didChangeAuthorizationStatus status: CLAuthorizationStatus) { 
    switch status: 
    case .AuthorizedAlways: 
     manager.startUpdatingLocation() 
    default: 
     break 
} 

Hinweis: Dies wird zumindest lassen Sie wissen, dass Sie richtig Ihre App den Standort des Nutzers verwenden autorisiert haben. Sie benötigen weiterhin etwas, um Ihre lazy var locationManager-Eigenschaft zu verwenden, um sie zu instanziieren. Ich würde stattdessen empfehlen, eine normale Eigenschaft zu verwenden und Ihre locationManager in viewDidLoad einzurichten.

Verwandte Themen