Подтвердить что ты не робот

Как найти свое текущее местоположение с помощью CoreLocation

Мне нужно найти текущее местоположение с помощью CoreLocation, я попробовал несколько методов, но до сих пор мой CLLocationManager возвращал только 0.. (0.000.00.000).

Здесь мой код (обновлен для работы):

Импорт

#import <CoreLocation/CoreLocation.h>

Заявлен:

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

Функции:

- (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];
}
4b9b3361

Ответ 1

Вы можете найти свое местоположение с помощью CoreLocation следующим образом:

import CoreLocation:

#import <CoreLocation/CoreLocation.h>

Объявить CLLocationManager:

CLLocationManager *locationManager;

Инициализируйте locationManager в viewDidLoad и создайте функцию, которая может return текущее местоположение как 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];
}

И вызов функции deviceLocation вернет местоположение, как ожидалось:

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

Это просто пример. Инициализация CLLocationManager, если пользователь не готов к этому, не является хорошей идеей. И, конечно, locationManager.location.coordinate можно использовать для получения latitude и longitude по желанию после инициализации CLLocationManager.

Не забудьте добавить CoreLocation.framework в свои настройки проекта на вкладке "Сборка фаз" (Targets->Build Phases->Link Binary).

Ответ 2

С CLLocationManager вам не нужно сразу получать информацию о местоположении. GPS и другие устройства, которые получают информацию о местоположении, могут не инициализироваться. Они могут занять некоторое время, прежде чем у них будет какая-либо информация. Вместо этого вам нужно создать объект-делегат, который отвечает на locationManager:didUpdateToLocation:fromLocation:, а затем установить его как делегата менеджера местоположений.

см. здесь

Ответ 3

Здесь вы можете показать текущее местоположение с деталями аннотации

в 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

в 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",
                                               @"[email protected]", @"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 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;
}