el cambio significativo de ubicación no se activa en el dispositivo
Estoy usando un monitoreo significativo del cambio de ubicación. Cuando ejecuto el código en el simulador y verifico la opción Autopista, recibo actualizaciones periódicas de ubicación. Tomo estas actualizaciones y las guardo en NSUserDefaults y luego actualizo la vista de tabla cada 10 segundos, así puedo ver si tengo alguna actualización. Si ejecuto la aplicación en un dispositivo real, obtengo cero actualizaciones. Mantuve el teléfono en mi bolsillo y recorrí más de 80 km, estuve en 2 ciudades. Cero actualizaciones. No estoy seguro si arruiné algo. Estoy adjuntando el código. El código es copiar y pegar, no dude en probarlo. Solo asegúrese de usar TableViewController en el guión gráfico y establezca la identificación de la celda en ID. ¿Qué me estoy perdiendo? Estoy probando en el iphone 5.
info.plist:
editar: Encontré esto en documentos de apple. Debería milocationManager
ser creado de manera diferente?
Cuando se relanza una aplicación debido a una actualización de ubicación, el diccionario de opciones de inicio se pasa a su aplicación: willFinishLaunchingWithOptions: o application: didFinishLaunchingWithOptions: el método contiene la clave UIApplicationLaunchOptionsLocationKey. La presencia de esa clave indica que los nuevos datos de ubicación están esperando ser entregados a su aplicación. Para obtener esos datos, debe crear un nuevo objeto CLLocationManager y reiniciar los servicios de ubicación que tenía antes de la finalización de la aplicación. Cuando reinicia esos servicios, el administrador de ubicación entrega todas las actualizaciones de ubicación pendientes a su delegado.
edit2:
En base a esto, la ubicación debe actualizarse al menos cada 15 minutos. Error en mi código confirmado.
Si la precisión del nivel de GPS no es crítica para su aplicación y no necesita un seguimiento continuo, puede usar el servicio de ubicación de cambios significativos. Es crucial que utilice correctamente el servicio de ubicación de cambios significativos, ya que activa el sistema y su aplicación al menos cada 15 minutos, incluso si no se han producido cambios de ubicación, y se ejecuta continuamente hasta que lo detiene.
edit3: agregó este código a AppDelegatedidFinishLaunchingWithOptions:
para ver si la aplicación se despierta. No se despierta: no veo ninguna entrada 200 200 en la vista de tabla. Algo raro está pasando.
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")
}
CÓDIGO: // 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
}
}
}
// Ver controlador
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()
}
}