xcode 如何使用 CoreLocation 查找您当前的位置

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/6516967/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-09 03:59:54  来源:igfitidea点击:

How to find your current location with CoreLocation

xcodelocationcore-locationcllocationmanager

提问by Aleksander Azizi

I need to find my current location with CoreLocation, I tried multiple methods but so far my CLLocationManagerhas only returned 0's.. (0.000.00.000).

我需要用 找到我当前的位置CoreLocation,我尝试了多种方法,但到目前为止我CLLocationManager只返回了 0..( 0.000.00.000)。

Here's my code (updated to work):

这是我的代码(更新后可以工作):

Imports:

进口

#import <CoreLocation/CoreLocation.h>

Declared:

声明

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

Functions:

功能

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

回答by Aleksander Azizi

You can find your location using CoreLocationlike this:

您可以使用以下方法找到您的位置CoreLocation

import CoreLocation:

进口CoreLocation

#import <CoreLocation/CoreLocation.h>

Declare CLLocationManager:

声明CLLocationManager

CLLocationManager *locationManager;

Initialize the locationManagerin viewDidLoadand create a function that can returnthe current location as an NSString:

初始化locationManagerinviewDidLoad并创建一个可以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];
}

And calling the deviceLocationfunction will return the location as expected:

调用该deviceLocation函数将按预期返回位置:

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

This is just an example. Initializing CLLocationManagerwithout the user being ready for it isn't a good idea. And, of course, locationManager.location.coordinatecan be used to get latitudeand longitudeat will after CLLocationManagerhas been initialized.

这只是一个例子。CLLocationManager在用户没有做好准备的情况下进行初始化不是一个好主意。并且,当然,locationManager.location.coordinate可以用来获取latitude并且longitudeCLLocationManager已经初始化之后随意。

Don't forget to add the CoreLocation.frameworkin your project settings under the Build Phases tab (Targets->Build Phases->Link Binary).

不要忘记CoreLocation.framework在 Build Phases 选项卡 ( Targets->Build Phases->Link Binary)下的项目设置中添加。

回答by ThomasW

With CLLocationManager you don't necessary get the location information immediately. The GPS and other devices that obtain location information might not be initialized. They can take a while before they have any information. Instead you need to create a delegate object that responds to locationManager:didUpdateToLocation:fromLocation:and then set it as the delegate of the location manager.

使用 CLLocationManager,您无需立即获取位置信息。GPS 和其他获取位置信息的设备可能未初始化。他们可能需要一段时间才能获得任何信息。相反,您需要创建一个响应的委托对象,locationManager:didUpdateToLocation:fromLocation:然后将其设置为位置管理器的委托。

see here

这里

回答by Sunil Targe

Here you can show current location with annotation details

您可以在此处显示带有注释详细信息的当前位置

in ViewController.h

在 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

in ViewController.m

在 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;
}