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
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
Ja, ich habe das –