2011-06-29 8 views
34

muszę znaleźć swoje aktualne położenie CoreLocation, próbowałem wielu metod, ale do tej pory mój CLLocationManager powrócił 0 na .. (0.000.00.000) tylko.Jak znaleźć swoją aktualną lokalizację CoreLocation

Oto mój kod (zaktualizowany do pracy):

Import:

#import <CoreLocation/CoreLocation.h> 

Deklarowana:

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

Funkcje:

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

Odpowiedz

77

Można znaleźć swoją lokalizację przy użyciu CoreLocation takiego:

import CoreLocation:

#import <CoreLocation/CoreLocation.h> 

stwierdzenie CLLocationManager:

CLLocationManager *locationManager; 

Inicjalizować locationManager w viewDidLoad i utworzyć funkcję, która może return bieżącą lokalizację jako 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]; 
} 

I wywołanie funkcji deviceLocation powróci lokalizację zgodnie z oczekiwaniami:

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

To tylko przykład. Inicjowanie CLLocationManager bez gotowości użytkownika nie jest dobrym pomysłem. Oczywiście można również użyć locationManager.location.coordinate, aby uzyskać latitude i longitude według woli po zainicjowaniu CLLocationManager.

Nie zapomnij dodać CoreLocation.framework w ustawieniach projektu w zakładce Fazy kompilacji (Targets->Build Phases->Link Binary).

+0

Jednak ta metoda nie zwraca już bieżącego położenia. Im przy użyciu Xcode 6. Ale było dobrze pracował przy użyciu Xcode 5. – SARATH

15

Za pomocą CLLocationManager nie trzeba natychmiast uzyskiwać informacji o lokalizacji. GPS i inne urządzenia uzyskujące informacje o lokalizacji mogą nie zostać zainicjalizowane. Mogą upłynąć trochę czasu, zanim będą mieli jakieś informacje. Zamiast tego musisz utworzyć obiekt uczestnika, który odpowiada na locationManager:didUpdateToLocation:fromLocation:, a następnie ustawić go jako delegata menedżera lokalizacji.

zobaczyć here

+2

Ten artykuł http: // mobileorchard.com/hello-there-a-referowanie-tutorial/(pobrane z pokrewnego pytania o stackoverflow) pokazuje, co robić. – ThomasW

-2

Tutaj można wyświetlić aktualną lokalizację ze szczegółami adnotacji

w 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 

w 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'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; 
} 
Powiązane problemy