Cómo encontrar tu ubicación actual con CoreLocation


Necesito encontrar mi ubicación actual con CoreLocation, he intentado múltiples métodos, pero hasta ahora mi CLLocationManager solo ha devuelto 0.. (0.000.00.000).

Aquí está mi código (actualizado para funcionar):

Importaciones :

#import <CoreLocation/CoreLocation.h>

Declarado:

IBOutlet CLLocationManager *locationManager;
IBOutlet UILabel *latLabel;
IBOutlet UILabel *longLabel;

Funciones:

- (void)getLocation { //Called when needed
    latLabel.text  = [NSString stringWithFormat:@"%f", locationManager.location.coordinate.latitude]; 
    longLabel.text = [NSString stringWithFormat:@"%f", locationManager.location.coordinate.longitude];
}

- (void)viewDidLoad {
    locationManager = [[CLLocationManager alloc] init];
    locationManager.distanceFilter = kCLDistanceFilterNone; // whenever we move
    locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; // 100 m
    [locationManager startUpdatingLocation];
}
Author: Aleksander Azizi, 2011-06-29

3 answers

Puedes encontrar tu ubicación usando CoreLocation así:

Importar CoreLocation:

#import <CoreLocation/CoreLocation.h>

Declarar CLLocationManager:

CLLocationManager *locationManager;

Inicializar el {[7] {} en[8]} y crear una función que puede return la ubicación actual como un NSString:

- (NSString *)deviceLocation {
    return [NSString stringWithFormat:@"latitude: %f longitude: %f", locationManager.location.coordinate.latitude, locationManager.location.coordinate.longitude];
}

- (void)viewDidLoad
{
    locationManager = [[CLLocationManager alloc] init];
    locationManager.distanceFilter = kCLDistanceFilterNone; // whenever we move
    locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; // 100 m
    [locationManager startUpdatingLocation];
}

Y llamando a la función deviceLocation devolverá la ubicación como se esperaba:

NSLog(@"%@", [self deviceLocation]);

Esto es solo un ejemplo. Inicializar CLLocationManager sin que el usuario esté listo para ello no es una buena idea. Y, por supuesto, locationManager.location.coordinate se puede utilizar para obtener latitude y longitude a voluntad después de que CLLocationManager haya sido inicializado.

No olvide agregar CoreLocation.framework en la configuración de su proyecto en la pestaña Fases de compilación (Targets->Build Phases->Link Binary).

 77
Author: Aleksander Azizi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-31 15:41:07

Con CLLocationManager no es necesario obtener la información de ubicación inmediatamente. Es posible que el GPS y otros dispositivos que obtienen información de ubicación no se inicialicen. Pueden tomar un tiempo antes de tener cualquier información. En su lugar, debe crear un objeto delegado que responda a locationManager:didUpdateToLocation:fromLocation: y luego configurarlo como delegado del administrador de ubicaciones.

Ver aquí

 15
Author: ThomasW,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-07 08:52:08

Aquí puede mostrar la ubicación actual con detalles de anotación

En ViewController.h

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


//My
#import <MapKit/MapKit.h>
#import <MessageUI/MFMailComposeViewController.h>

@interface ViewController : UIViewController<CLLocationManagerDelegate,MKMapViewDelegate,MFMailComposeViewControllerDelegate>
{
    IBOutlet UILabel *lblLatitiude;
    IBOutlet UILabel *lblLongitude;
    IBOutlet UILabel *lblAdress;
}
//My
@property (nonatomic, strong) IBOutlet MKMapView *mapView;


-(IBAction)getMyLocation:(id)sender;

@end

En ViewController.m

#import "ViewController.h"


@interface ViewController ()

@end

@implementation ViewController{
    CLLocationManager *locationManager;
    CLGeocoder *geocoder;
    CLPlacemark *placemark;
}

@synthesize mapView;

- (void)viewDidLoad
{
    [super viewDidLoad];
    locationManager = [[CLLocationManager alloc] init];
     geocoder = [[CLGeocoder alloc] init];

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    NSMutableDictionary *defaultsDictionary = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"[email protected]", @"fromEmail",
                                               @"[email protected]", @"toEmail",
                                               @"smtp.gmail.com", @"relayHost",
                                               @"[email protected]", @"login",
                                               @"mobile@123", @"pass",
                                               [NSNumber numberWithBool:YES], @"requiresAuth",
                                               [NSNumber numberWithBool:YES], @"wantsSecure", nil];

    [userDefaults registerDefaults:defaultsDictionary];


    self.mapView.delegate=self;

}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark - Custom Methods


-(IBAction)getMyLocation:(id)sender{
    locationManager.delegate = self;
    locationManager.desiredAccuracy = kCLLocationAccuracyBest;

    [locationManager startUpdatingLocation];
}


#pragma mark - CLLocationManagerDelegate

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
    NSLog(@"didFailWithError: %@", error);
    UIAlertView *errorAlert = [[UIAlertView alloc]
                               initWithTitle:@"Error" message:@"Failed to Get Your Location" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [errorAlert show];
}

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
    NSLog(@"didUpdateToLocation: %@", newLocation);
    CLLocation *currentLocation = newLocation;

    if (currentLocation != nil) {
        lblLongitude.text = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.longitude];
        lblLatitiude.text = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.latitude];
    }

    // Stop Location Manager
    [locationManager stopUpdatingLocation];

    // Reverse Geocoding
    NSLog(@"Resolving the Address");
    [geocoder reverseGeocodeLocation:currentLocation completionHandler:^(NSArray *placemarks, NSError *error) {
        NSLog(@"Found placemarks: %@, error: %@", placemarks, error);
        if (error == nil && [placemarks count] > 0) {
            placemark = [placemarks lastObject];

            lblAdress.text = [NSString stringWithFormat:@"%@ %@\n%@ %@\n%@\n%@",
                                 placemark.subThoroughfare, placemark.thoroughfare,
                                 placemark.postalCode, placemark.locality,
                                 placemark.administrativeArea,
                                 placemark.country];



            MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(currentLocation.coordinate, 800, 800);
            [self.mapView setRegion:[self.mapView regionThatFits:region] animated:YES];

            // Add an annotation
            MKPointAnnotation *point = [[MKPointAnnotation alloc] init];
            point.coordinate = currentLocation.coordinate;
            point.title = @"Where am I?";
            point.subtitle = [NSString stringWithFormat:@"%@ %@\n%@ %@\n%@\n%@",
                              placemark.subThoroughfare, placemark.thoroughfare,
                              placemark.postalCode, placemark.locality,
                              placemark.administrativeArea,
                              placemark.country];


            [self.mapView addAnnotation:point];


        } else {
            NSLog(@"%@", error.debugDescription);
        }
    } ];


}

//My
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    MKAnnotationView *annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"loc"];
    annotationView.canShowCallout = YES;
    annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];

    return annotationView;
}

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{

    [self getSignScreenShot];

    MFMailComposeViewController* controller = [[MFMailComposeViewController alloc] init];
    controller.mailComposeDelegate = self;
    [controller setSubject:@"My Subject"];
    [controller setMessageBody:@"Hello there." isHTML:NO];
    if (controller) [self presentModalViewController:controller animated:YES];
}

- (void)mailComposeController:(MFMailComposeViewController*)controller
          didFinishWithResult:(MFMailComposeResult)result
                        error:(NSError*)error;
{
    if (result == MFMailComposeResultSent) {
        NSLog(@"It's away!");
    }
    [self dismissModalViewControllerAnimated:YES];
}

//-----------------------------------------------------------------------------------
//This methos is to take screenshot of map
//-----------------------------------------------------------------------------------
-(UIImage *)getSignScreenShot
{
    CGRect rect = CGRectMake(self.mapView.frame.origin.x,self.mapView.frame.origin.y-50,self.mapView.frame.size.width+60,self.mapView.frame.size.height+15);
    UIGraphicsBeginImageContextWithOptions(self.mapView.frame.size, NO, 1.0);
    [self.mapView.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *screenshot = UIGraphicsGetImageFromCurrentImageContext();
    CGImageRef imageRef = CGImageCreateWithImageInRect([screenshot CGImage], rect);
    UIImage *newImage = [UIImage imageWithCGImage:imageRef];

    return newImage;
}
 -2
Author: Sunil Targe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-04 11:13:50