Sto utilizzando il monitoraggio significativo della modifica della posizione. Quando eseguo il codice nel simulatore e controllo l'opzione Freeway, ricevo aggiornamenti periodici sulla posizione. Prendo questi aggiornamenti e li salvo in NSUserDefaults e aggiorno tableview ogni 10s, così posso vedere se ho degli aggiornamenti. Se eseguo l'app su un dispositivo reale, ottengo zero aggiornamenti. Ho tenuto il telefono in tasca e ho percorso più di 80 km, sono stato in 2 città. Zero aggiornamenti. Non sono sicuro se ho incasinato qualcosa. Vi allego il codice. Il codice è copia incolla, sentiti libero di testare. Assicurati di utilizzare TableViewController nello storyboard e imposta ID cella su ID. Cosa mi manca? Sono test su iPhone 5.il cambio di posizione significativo non si attiva sul dispositivo
info.plist:
edit: trovato questo nel docs apple. Il mio locationManager
dovrebbe essere creato in modo diverso?
Quando un'applicazione viene rilanciato a causa di un aggiornamento di posizione, il lancio opzioni dizionario passato al applicazione: willFinishLaunchingWithOptions: o applicazione: didFinishLaunchingWithOptions: metodo contiene la chiave UIApplicationLaunchOptionsLocationKey. La presenza di quel tasto segnala che i nuovi dati sulla posizione sono in attesa di essere consegnati alla tua app. Per ottenere tali dati, è necessario creare un nuovo oggetto CLLocationManager e riavviare i servizi di localizzazione che erano in esecuzione prima della terminazione dell'app . Quando si riavviano tali servizi, il responsabile della posizione consegna tutti gli aggiornamenti di posizione in sospeso al delegato.
EDIT2:
Sulla base di questo, la posizione deve essere aggiornato almeno ogni 15 minuti. Bug nel mio codice confermato.
Se la precisione a livello di GPS non è fondamentale per la vostra applicazione e non è necessario continuo monitoraggio, è possibile utilizzare il significativo cambiamento di servizio di localizzazione . È fondamentale utilizzare il servizio di cambio di posizione significativo in modo corretto, poiché riattiva il sistema e l'app almeno ogni 15 minuti, anche se non si sono verificati cambiamenti di posizione e il suo viene eseguito continuamente fino a quando non viene interrotto.
edit3: aggiunto questo codice a AppDelegate didFinishLaunchingWithOptions:
per vedere se l'app si risveglia. Non si risveglia, non vedo la voce 200 200 nella vista tabella. Sta succedendo qualcosa di strano.
if let options = launchOptions {
print("options")
if (launchOptions![UIApplicationLaunchOptionsLocationKey] != nil){
locationManager.startUpdatingLocation()
self.lat.append(Double(200))
self.lon.append(Double(200))
self.times.append(NSDateFormatter.localizedStringFromDate(NSDate(), dateStyle: .NoStyle, timeStyle: .ShortStyle))
NSUserDefaults.standardUserDefaults().setObject(lat, forKey: "lat")
NSUserDefaults.standardUserDefaults().setObject(lon, forKey: "lon")
NSUserDefaults.standardUserDefaults().setObject(times, forKey: "time")
}
CODICE: // AppDelegate:
import UIKit
import CoreLocation
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, CLLocationManagerDelegate {
var lat:[CLLocationDegrees]!
var lon:[CLLocationDegrees]!
var times:[String]!
var distances: [String]!
var window: UIWindow?
var locationManager: CLLocationManager!
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
locationManager=CLLocationManager()
locationManager.delegate=self
locationManager.requestAlwaysAuthorization()
let isFirstLaunch = NSUserDefaults.standardUserDefaults().objectForKey("lat")
if isFirstLaunch == nil{
lat = [CLLocationDegrees]()
lon = [CLLocationDegrees]()
times = [String]()
NSUserDefaults.standardUserDefaults().setObject(lat, forKey: "lat")
NSUserDefaults.standardUserDefaults().setObject(lon, forKey: "lon")
NSUserDefaults.standardUserDefaults().setObject(times, forKey: "time")
}else{
lat = NSUserDefaults.standardUserDefaults().arrayForKey("lat") as! [CLLocationDegrees]
lon = NSUserDefaults.standardUserDefaults().arrayForKey("lon") as! [CLLocationDegrees]
times = NSUserDefaults.standardUserDefaults().objectForKey("time") as! [String]
// distances = NSUserDefaults.standardUserDefaults().objectForKey("distance") as! [String]
}
return true
}
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
print("location updated")
self.lat.append(locations[0].coordinate.latitude)
self.lon.append(locations[0].coordinate.longitude)
self.times.append(NSDateFormatter.localizedStringFromDate(NSDate(), dateStyle: .NoStyle, timeStyle: .ShortStyle))
NSUserDefaults.standardUserDefaults().setObject(lat, forKey: "lat")
NSUserDefaults.standardUserDefaults().setObject(lon, forKey: "lon")
NSUserDefaults.standardUserDefaults().setObject(times, forKey: "time")
print("Location: \(locations[0].coordinate.latitude) \(locations[0].coordinate.longitude)")
}
func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
print("did change AS")
switch status {
case .AuthorizedWhenInUse:
locationManager.startMonitoringSignificantLocationChanges()
case .AuthorizedAlways:
print("to always")
locationManager.startMonitoringSignificantLocationChanges()
if lat.count==0{
self.lat.append((locationManager.location?.coordinate.latitude)!)
self.lon.append((locationManager.location?.coordinate.longitude)!)
self.times.append(NSDateFormatter.localizedStringFromDate(NSDate(), dateStyle: .NoStyle, timeStyle: .ShortStyle))
NSUserDefaults.standardUserDefaults().setObject(lat, forKey: "lat")
NSUserDefaults.standardUserDefaults().setObject(lon, forKey: "lon")
NSUserDefaults.standardUserDefaults().setObject(times, forKey: "time")
}
// locationManager.startUpdatingLocation()
break
default:
locationManager.stopMonitoringSignificantLocationChanges()
break
}
}
}
// View Controller
import UIKit
class TableViewController: UITableViewController {
let appDel = UIApplication.sharedApplication().delegate as! AppDelegate
override func viewDidLoad() {
super.viewDidLoad()
NSTimer.scheduledTimerWithTimeInterval(10, target: self, selector: "updateTableView", userInfo: nil, repeats: true)
}
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
return appDel.lon.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("ID", forIndexPath: indexPath)
cell.textLabel?.text = "\(appDel.lat[indexPath.row]) \(appDel.lon[indexPath.row]) \(appDel.times[indexPath.row])"
cell.textLabel?.font = UIFont.systemFontOfSize(9)
return cell
}
func updateTableView(){
self.tableView.reloadData()
}
}
Vede effettivamente la richiesta di autorizzazione? In caso contrario, hai NSLocationAlwaysUsageDescription nel tuo plist? –
sì la richiesta si apre.E sì, la stringa NSLocationAlwaysUsageDescription è impostata in info.plist. – brumbrum
Stai uccidendo l'app toccando due volte il pulsante Home e scorrendo verso l'alto sull'app? Se uccidi un'applicazione in questo modo, non eseguirà servizi di modifica significativi in background. – Rob