如何使用CoreLocationfind您的当前位置
我需要find我的CoreLocation
当前位置,我尝试了多种方法,但到目前为止,我的CLLocationManager
只返回0 ..( 0.000.00.000
)。
这是我的代码( 更新到工作 ):
import :
#import <CoreLocation/CoreLocation.h>
宣布 :
IBOutlet CLLocationManager *locationManager; IBOutlet UILabel *latLabel; IBOutlet UILabel *longLabel;
function :
- (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]; }
你可以像这样使用CoreLocation
来find你的位置:
导入CoreLocation
:
#import <CoreLocation/CoreLocation.h>
声明CLLocationManager
:
CLLocationManager *locationManager;
在viewDidLoad
初始化locationManager
,并创build一个可以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
在CLLocationManager
初始化后随意获取latitude
。
不要忘记在“构build阶段”选项卡(目标 – Targets->Build Phases->Link Binary
)下的项目设置中添加CoreLocation.framework
。
使用CLLocationManager,您不必立即获取位置信息。 GPS和其他获取位置信息的设备可能不会被初始化。 他们可能需要一段时间才能得到任何信息。 相反,您需要创build一个响应locationManager:didUpdateToLocation:fromLocation:
的委托对象locationManager:didUpdateToLocation:fromLocation:
然后将其设置为位置pipe理器的委托。
看到这里
在这里,您可以显示当前位置的注释详细信息
在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:@"pradipvdeore@gmail.com", @"fromEmail", @"pavitrarupani89@gmail.com", @"toEmail", @"smtp.gmail.com", @"relayHost", @"mobileapp.qa@gmail.com", @"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; }