0 votos

Seguimiento de Ubicacion

Hola amigos disculpen la pregunta podria ser ya contestada pero me da dado mas dudas cuando entro al tema del seguimiento de la ubicación del usuario Les comento mi aplicación necesita obtener la ubicación del usuario aunque no se esté ejecutando la aplicación y esta ubicación al ser cambiada debe de hacer una insercion a una base de datos no lo he probado con un dispositivo real solo en el emulador pro he leido que debo de activar en background la "location update" o background fetch no entiendo porque pero he leido documentacion asi.

Mi codigo es el siguiente ViewController.h

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>

@interface ViewController : UIViewController <CLLocationManagerDelegate>
@property (nonatomic, strong) CLLocationManager *locationManager;
@property (strong, nonatomic) IBOutlet UILabel *lblUbicacion;
- (IBAction)salir:(id)sender;

@end

ViewController.m

#import "ViewController.h"
#import <CoreLocation/CoreLocation.h>

@interface ViewController ()
@end

@implementation ViewController

 - (void)viewDidLoad {
     [super viewDidLoad];
     // Do any additional setup after loading the view, typically from a nib.

     int distancia = 200;
     [[NSUserDefaults standardUserDefaults] setInteger:distancia forKey:@"distancia"];
     [[NSUserDefaults standardUserDefaults] synchronize];

     //REPRESENTANTE
    NSString *idRepresentante = [[NSUserDefaults standardUserDefaults] stringForKey:@"idRepresentante"];
    NSLog(@"Soy el representante %@",idRepresentante);

     self.locationManager = [[CLLocationManager alloc] init];
     self.locationManager.delegate = self;

     [self.locationManager requestWhenInUseAuthorization];
     [self.locationManager requestAlwaysAuthorization];

      //self.mapView.delegate = self;
      [self locationManager];
      [self startStandardUpdates];

}

-(void)startStandardUpdates{

    //Distancia recorrido
    NSString *idDistancia = [[NSUserDefaults standardUserDefaults] stringForKey:@"distancia"];
    int distacia = [idDistancia intValue];

    int metros = distacia;
    NSLog(@"Distancia que voy a recorrer %d",metros);

    if(nil == _locationManager)
    _locationManager = [[CLLocationManager alloc]init];

    _locationManager.delegate=self;
    _locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    //colocar Limites
    _locationManager.distanceFilter = metros; //metros
    //_locationManager.activityType = CLTimeIntervalMax;

    [_locationManager startUpdatingLocation];
}

-(void) locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
    CLLocation *location = [locations lastObject];

    if (location.horizontalAccuracy < 0) {
        return;
    }
    NSTimeInterval interval = [location.timestamp timeIntervalSinceNow];
    //check against absolute value of the interval
    if (fabs(interval)<30) {
        //DO STUFF
        NSLog(@"latitude %+.6f, longitude %+.6f",location.coordinate.latitude, location.coordinate.longitude);
        NSString *ubicacion = [NSString stringWithFormat:@"%+.6f, %+.6f",location.coordinate.latitude, location.coordinate.longitude];

         //REPRESENTANTE
         NSString *idRepresentante = [[NSUserDefaults standardUserDefaults] stringForKey:@"idRepresentante"];

         NSInteger success = 0;
         @try {
                NSString *post =[[NSString alloc] initWithFormat:@"&ubicacion=%@&idRepresentante=%@", ubicacion, idRepresentante ];
                NSLog(@"PostData: %@",post);
                NSURL *url=[NSURL URLWithString:@"http://servidor.com/rutas/addDatos.php"];
                NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
                NSString *postLength = [NSString stringWithFormat:@"%lu", (unsigned long)[postData length]];
                NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
                [request setURL:url];
                [request setHTTPMethod:@"POST"];
                [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
                [request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
                [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
                [request setHTTPBody:postData];

                //[NSURLRequest setAllowsAnyHTTPSCertificate:YES forHost:[url host]];

                NSError *error = [[NSError alloc] init];
                NSHTTPURLResponse *response = nil;
                NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

                if ([response statusCode] >= 200 && [response statusCode] < 300)
                {
                    NSString *responseData = [[NSString alloc]initWithData:urlData encoding:NSUTF8StringEncoding];
                    NSLog(@"Response ==> %@", responseData);

                    NSError *error = nil;
                    NSDictionary *jsonData = [NSJSONSerialization
                                              JSONObjectWithData:urlData
                                              options:NSJSONReadingMutableContainers
                                              error:&error];

                    success = [jsonData[@"success"] integerValue];
                    NSLog(@"Success: %ld",(long)success);
                    NSString *distancia = [jsonData objectForKey:@"metros"];

                    if(success == 1)
                    {
                        NSLog(@"BIEN");

                        [[NSUserDefaults standardUserDefaults] setObject:distancia forKey:@"distancia"];
                        [[NSUserDefaults standardUserDefaults] synchronize];
                        NSLog(@"Nueva distancia %@", distancia);

                        int numero = 1;
                        NSString *contador = [[NSUserDefaults standardUserDefaults] stringForKey:@"contador"];
                        int suma = [contador intValue];

                        int sumatoria = numero + suma;
                        [[NSUserDefaults standardUserDefaults] setInteger:sumatoria forKey:@"contador"];
                        [[NSUserDefaults standardUserDefaults] synchronize];

                        NSLog(@"insercion %d",sumatoria);

                        NSString *contadorN = [[NSUserDefaults standardUserDefaults] stringForKey:@"contador"];
                        NSLog(@"contador quedo en %@", contadorN);
                        _insercion.text = contadorN;

                    }else {
                        //NSString *error_msg = (NSString *) jsonData[@"error_message"];
                        NSLog(@"Mal");
                        [self startStandardUpdates];
                    } 
                } else {
                    NSLog(@"FALLO LA CONEXION.");
                    //[self startStandardUpdates];               
                }
            }
            @catch (NSException * e) {
                NSLog(@"Exception: %@", e); 
            }
}

Con mi poca experiencia estoy consiguiendo mi latitud y longitud y la inserto pero no se si esta inserción la haría automáticamente a mi servidor aunque la aplicación no esté abierta y es lo que necesito por eso en mi info.plist configure esto Info.plist

Capabilities de mi aplicación

Capabilities

Mi duda esto sirve o que mas debo de hacer para obtener la ubicación y subirla a mi servidor o se tiene que configurar otra cosa se loa agradeceria mucho. De antemano GRACIAS.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: