简体   繁体   English

如何在iOS中使用CLLocationManager获取当前位置

[英]How to get current location using CLLocationManager in iOS

I can already find the current location using latitude and longitude, but I would also like to be able to find the current location given a zip code. 我已经可以使用纬度和经度找到当前位置,但是我也希望能够在给出邮政编码的情况下找到当前位置。

Here is what I have so far: 这是我到目前为止的内容:

.h 。H

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


@interface ViewController : UIViewController<CLLocationManagerDelegate>

{

CLLocationManager *locationManager;
 CLLocation *currentLocation;

    IBOutlet UILabel *label1;
    IBOutlet UILabel *lable2;

}
@property (weak, nonatomic) IBOutlet MKMapView *myMapview;
@property (weak, nonatomic) IBOutlet UILabel *label2;
@property (weak, nonatomic) IBOutlet UILabel *lable1;
@end

.m .m

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad

{

    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    locationManager = [[CLLocationManager alloc]init];



    locationManager.delegate = self;


    locationManager.distanceFilter = kCLDistanceFilterNone;


    locationManager.desiredAccuracy = kCLLocationAccuracyBest;


    [locationManager startUpdatingLocation];


    _myMapview.showsUserLocation = YES;

    [self->locationManager startUpdatingLocation];



    CLLocation *location = [locationManager location];


    CLLocationCoordinate2D coordinate = [location coordinate];


    NSString *latitude = [NSString stringWithFormat:@"%f", coordinate.latitude];
    NSString *longitude = [NSString stringWithFormat:@"%f", coordinate.longitude];

    //NSLog(@”dLatitude : %@”, latitude);
    //NSLog(@”dLongitude : %@”,longitude);
    NSLog(@"MY HOME :%@", latitude);
    NSLog(@"MY HOME: %@ ", longitude);

}

#pragma mark CLLocationManager Delegate
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    currentLocation = [locations objectAtIndex:0];
    [locationManager stopUpdatingLocation];

    [self->locationManager stopUpdatingLocation];




    NSLog(@"my latitude :%f",currentLocation.coordinate.latitude);

    NSLog(@"my longitude :%f",currentLocation.coordinate.longitude);
    label1.text = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.longitude];
    lable2.text = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.latitude];


    NSLog(@"Detected Location : %f, %f", currentLocation.coordinate.latitude, currentLocation.coordinate.longitude);
    CLGeocoder *geocoder = [[CLGeocoder alloc] init] ;
    [geocoder reverseGeocodeLocation:currentLocation
                   completionHandler:^(NSArray *placemarks, NSError *error)
     {
                       if (error)
                       {
                           NSLog(@"Geocode failed with error: %@", error);
                           return;
                       }

NSLog(@"Monday");
                       CLPlacemark *placemark = [placemarks objectAtIndex:0];
                       NSLog(@"placemark.ISOcountryCode %@",placemark.ISOcountryCode);

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

    if (currentLocation != nil)
    {

    label1.text = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.longitude];
    lable2.text = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.latitude];
    }
}

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

@end

Step 1: Import MobileCoreServices framework in .h File 步骤1:.h文件中导入MobileCoreServices框架

#import <MobileCoreServices/MobileCoreServices.h>

Step 2: Add delegate CLLocationManagerDelegate 步骤2:添加委托CLLocationManagerDelegate

@interface yourViewController : UIViewController<CLLocationManagerDelegate>
{
    CLLocationManager *locationManager;
    CLLocation *currentLocation;
}

Step 3: Add this code in class file 步骤3:将此代码添加到类文件中

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self CurrentLocationIdentifier]; // call this method
}

Step 4: Method to get location 步骤4:获取位置的方法

//------------ Current Location Address-----
-(void)CurrentLocationIdentifier
{
    //---- For getting current gps location
    locationManager = [CLLocationManager new];
    locationManager.delegate = self;
    locationManager.distanceFilter = kCLDistanceFilterNone;
    locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    [locationManager startUpdatingLocation];
    //------
}
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    currentLocation = [locations objectAtIndex:0];
    [locationManager stopUpdatingLocation];
    CLGeocoder *geocoder = [[CLGeocoder alloc] init] ;
    [geocoder reverseGeocodeLocation:currentLocation completionHandler:^(NSArray *placemarks, NSError *error)
     {
         if (!(error))
         {
             CLPlacemark *placemark = [placemarks objectAtIndex:0];
            NSLog(@"\nCurrent Location Detected\n");
             NSLog(@"placemark %@",placemark);
             NSString *locatedAt = [[placemark.addressDictionary valueForKey:@"FormattedAddressLines"] componentsJoinedByString:@", "];
             NSString *Address = [[NSString alloc]initWithString:locatedAt];
             NSString *Area = [[NSString alloc]initWithString:placemark.locality];
             NSString *Country = [[NSString alloc]initWithString:placemark.country];
             NSString *CountryArea = [NSString stringWithFormat:@"%@, %@", Area,Country];
             NSLog(@"%@",CountryArea);
         }
         else
         {
             NSLog(@"Geocode failed with error %@", error);
             NSLog(@"\nCurrent Location Not Detected\n");
             //return;
             CountryArea = NULL;
         }
         /*---- For more results 
         placemark.region);
         placemark.country);
         placemark.locality); 
         placemark.name);
         placemark.ocean);
         placemark.postalCode);
         placemark.subLocality);
         placemark.location);
          ------*/
     }];
}

Here is a code to get user current location using block 这是使用代码获取用户当前位置的代码

1) #import <CoreLocation/CoreLocation.h> 1) #import <CoreLocation/CoreLocation.h>

2) <CLLocationManagerDelegate> 2) <CLLocationManagerDelegate>

3) in .h file 3)在.h文件中

//Location
typedef void(^locationBlock)();

//Location
-(void)GetCurrentLocation_WithBlock:(void(^)())block;

@property (nonatomic, strong) locationBlock _locationBlock;
@property (nonatomic,copy)CLLocationManager *locationManager;
@property (nonatomic)CLLocationCoordinate2D coordinate;
@property (nonatomic,strong) NSString *current_Lat;
@property (nonatomic,strong) NSString *current_Long;

4) in .m file 4)在.m文件中

#pragma mark - CLLocationManager
-(void)GetCurrentLocation_WithBlock:(void(^)())block {
    self._locationBlock = block;
    _locationManager = [[CLLocationManager alloc] init];
    [_locationManager setDelegate:self];
    [_locationManager setDistanceFilter:kCLDistanceFilterNone];
    [_locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
    if (IS_OS_8_OR_LATER) {
        if ([_locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
            [_locationManager requestWhenInUseAuthorization];
            [_locationManager requestAlwaysAuthorization];
        }
    }
    [_locationManager startUpdatingLocation];
}

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
    CLLocation *currentLoc=[locations objectAtIndex:0];
    _coordinate=currentLoc.coordinate;
    _current_Lat = [NSString stringWithFormat:@"%f",currentLoc.coordinate.latitude];
    _current_Long = [NSString stringWithFormat:@"%f",currentLoc.coordinate.longitude];
    NSLog(@"here lat %@ and here long %@",_current_Lat,_current_Long);
    self._locationBlock();
    [_locationManager stopUpdatingLocation];
    _locationManager = nil;
}

- (void)locationManager:(CLLocationManager *)manager
       didFailWithError:(NSError *)error {
}

5) Call function 5)通话功能

- (void)viewDidLoad {
    [super viewDidLoad];
    [self GetCurrentLocation_WithBlock:^{
        NSLog(@"Lat ::%f,Long ::%f",[self.current_Lat floatValue],[self.current_Long floatValue]);
    }];
}

6) And add below line to .plist 6)并将以下行添加到.plist

Any one or both of below keys needs to be added in Info.plist file. 下面的任何一个键或两个键都需要添加到Info.plist文件中。

NSLocationWhenInUseUsageDescription
NSLocationAlwaysUsageDescription

You can call Google APIs Maps service to get the location using zipcode: 您可以调用Google API Maps服务以使用邮政编码获取位置:

Just enter your zipcode in address={your zipcode} . 只需在address={your zipcode}输入您的邮政编码。

if location permissions not asking when you first launch then you cant get your current location . 如果位置权限没有询问您何时首次启动,那么您将无法获取当前位置。

iOS8 has got us major API changes with the LocationsServices iOS8通过LocationsServices对我们进行了重大的API更改

Assuming [CLLocationManager locationServicesEnabled] return YES, 假设[CLLocationManager locationServicesEnabled]返回YES,

With the First Launch of the iOS App [both iOS7 and iOS8] - locationMangers(CLLocationManager) 首次启动iOS应用程序[iOS7和iOS8]-locationMangers(CLLocationManager)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM