简体   繁体   English

如何获取当前位置IOS设备

[英]How to get current location IOS device

I have been using GMSMap in my app.我一直在我的应用程序中使用 GMSMap。 I want in my GMSMap user current location lat long.我想在我的 GMSMap 用户当前位置经纬度。 I am used lots of method but don't get current location.我使用了很多方法,但没有获得当前位置。 Please help and guid how to get my current location.请帮助并指导如何获取我当前的位置。 I have read many tutorial and follow but don't get.我已经阅读了很多教程并遵循但没有得到。

I have one question, I am using methods and any other work will be in my project?我有一个问题,我正在使用方法,我的项目中还有其他工作吗? I am so tired please help.我很累,请帮忙。

Firstly I have write show bellow methods in my project then create IPA and install my device.首先,我在我的项目中编写了显示波纹管方法,然后创建 IPA 并安装我的设备。 But don't get current location latitude longitude.但不要获取当前位置纬度经度。

Please help.请帮忙。 Thankyou谢谢

First第一的

-(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];
         _adrs_lbl.text = Address;
         NSString *Area = [[NSString alloc]initWithString:placemark.locality];
        NSString *Country = [[NSString alloc]initWithString:placemark.country];
         _lat_lbl.text = Country;

         NSString *CountryArea = [NSString stringWithFormat:@"%@, %@", Area,Country];
         NSLog(@"%@",CountryArea);
         _long_lbl.text = CountryArea;

     }
     else
     {
         NSLog(@"Geocode failed with error %@", error);
         NSLog(@"\nCurrent Location Not Detected\n");
         //return;
         //CountryArea = NULL;

     }

 }];
 }

Second第二

- (void)viewDidLoad
{
[super viewDidLoad];

if ([CLLocationManager locationServicesEnabled]) {
    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.delegate = self;
    [self.locationManager startUpdatingLocation];
} else {
    NSLog(@"Location services are not enabled");
}
}

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
CLLocation *location = [locations lastObject];
self.latitudeValue.text = [NSString stringWithFormat:@"%f", location.coordinate.latitude];
self.longtitudeValue.text = [NSString stringWithFormat:@"%f", location.coordinate.longitude];
 }

UPDATED QUESTION更新的问题

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
currentLocation = [locations lastObject];
if (currentLocation != nil){
    NSLog(@"The latitude value is - %@",[NSString stringWithFormat:@"%.8f", currentLocation.coordinate.latitude]);
    NSLog(@"The logitude value is - %@",[NSString stringWithFormat:@"%.8f", currentLocation.coordinate.longitude]);
}
//Current
GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:currentLocation.coordinate.latitude longitude: currentLocation.coordinate.longitude zoom:13];

self.mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera];
self.mapView.myLocationEnabled = YES;
self.mapView.delegate = self;
self.mapView.frame = viewDirection.bounds;
[viewDirection addSubview:self.mapView];

//    GMSMarker *marker = [[GMSMarker alloc] init];
//    marker.position = CLLocationCoordinate2DMake(currentLocation.coordinate.latitude, currentLocation.coordinate.longitude);
//    marker.title = @"Your Office Name";
//    marker.icon = [UIImage imageNamed:@"boss-icon.png"];
//    //OR
//    marker.icon = [GMSMarker markerImageWithColor:[UIColor blueColor]];
//    marker.snippet = @"Current Location";
//    marker.map = self.mapView;


GMSMarker *marker1 = [[GMSMarker alloc] init];
marker1.position = CLLocationCoordinate2DMake(currentLocation.coordinate.latitude, currentLocation.coordinate.longitude);
marker1.icon = [GMSMarker markerImageWithColor:[UIColor redColor]];
marker1.title = @"my location";
marker1.snippet = @"City Name";
marker1.map = self.mapView;


GMSMarker *marker2 = [[GMSMarker alloc] init];
marker2.position = CLLocationCoordinate2DMake(22.6990,75.8671);
marker2.icon = [GMSMarker markerImageWithColor:[UIColor greenColor]];
marker2.title = @"Destination location";
marker2.snippet = @"City Name";
marker2.map = self.mapView;

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

NSString *destinationString = [NSString stringWithFormat:@"%f,%f",22.6990,75.8671];

NSString *str = [NSString stringWithFormat:@"http://maps.googleapis.com/maps/api/directions/json?origin=%@&destination=%@&sensor=false",originString,destinationString];
NSURL *url=[[NSURL alloc]initWithString:[str stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]]];
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
NSURLSessionDataTask * dataTask = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    if(data == nil) {
        return;
    }else{
        NSDictionary* json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
        NSArray* latestRoutes = [json objectForKey:@"routes"];
        NSString *points=[[[latestRoutes objectAtIndex:0] objectForKey:@"overview_polyline"] objectForKey:@"points"];
        _text.text = points;
        @try {
            // TODO: better parsing. Regular expression?
            NSArray *temp= [self decodePolyLine:[points mutableCopy]];
            GMSMutablePath *path = [GMSMutablePath path];
            for(int idx = 0; idx < [temp count]; idx++){
                CLLocation *location=[temp objectAtIndex:idx];
                [path addCoordinate:location.coordinate];
            }
            // create the polyline based on the array of points.
            GMSPolyline *rectangle = [GMSPolyline polylineWithPath:path];
            rectangle.strokeWidth=5.0;
            rectangle.strokeColor = [UIColor redColor];
            rectangle.map = self.mapView;

            [locationManager stopUpdatingLocation];
        }
        @catch (NSException * e) {
            // TODO: show erro
        }
    }
}];
[dataTask resume];

 [locationManager stopUpdatingLocation];

 }

GMSMapView image GMSMapView 图像

Check my PolyLine IMAGE检查我的折线图像

I give you the solution step by step我一步一步给你解决方案

STEP 1:第1步:

First we should get the Google Map SDK首先我们应该得到Google Map SDK

Drag the following bundles into your project (when prompted, select Copy items if needed):将以下包拖到您的项目中(出现提示时,如果需要,请选择复制项目):

Subspecs/Base/Frameworks/GoogleMapsBase.framework
Subspecs/Maps/Frameworks/GoogleMaps.framework
Subspecs/Maps/Frameworks/GoogleMapsCore.framework

Right-click GoogleMaps.framework in your project, and select Show In Finder.右键单击项目中的 GoogleMaps.framework,然后选择在 Finder 中显示。

Drag the GoogleMaps.bundle from the Resources folder into your project.将 GoogleMaps.bundle 从 Resources 文件夹拖到您的项目中。 When prompted, ensure Copy items into destination group's folder is not selected.出现提示时,确保未选择将项目复制到目标组的文件夹中。

Select your project from the Project Navigator, and choose your application's target.从项目导航器中选择您的项目,然后选择您的应用程序的目标。

Open the Build Phases tab, and within Link Binary with Libraries, add the following frameworks:打开 Build Phases 选项卡,然后在 Link Binary with Libraries 中添加以下框架:

GoogleMapsBase.framework
GoogleMaps.framework
GoogleMapsCore.framework
GoogleMapsM4B.framework (Premium Plan customers only)
Accelerate.framework
CoreData.framework
CoreGraphics.framework
CoreLocation.framework
CoreText.framework
GLKit.framework
ImageIO.framework
libc++.tbd
libz.tbd
OpenGLES.framework
QuartzCore.framework
SystemConfiguration.framework
UIKit.framework

STEP 2:第2步:

Get the API key 获取 API 密钥

STEP 3:第 3 步:

Add the below things in your Plist    

  App Transport Security Settings   Dictionary 
  Allow Arbitrary Loads             Boolean          YES


  <key>NSLocationWhenInUseUsageDescription</key>
  <string>RehabTask requires location services to work</string>

  <key>NSLocationAlwaysUsageDescription</key>
  <string>RehabTask requires location services to work</string>        

            OR

   Privacy - Location When In Use Usage Description   string    RehabTask requires location services to work
   Privacy - Location Always Usage Description        string    RehabTask requires location services to work

Also you need to add您还需要添加

  <key>LSApplicationQueriesSchemes</key>
  <array>
     <string>googlechromes</string>
     <string>comgooglemaps</string>
  </array>

STEP 4: In appDelegate add below code第 4在 appDelegate 中添加以下代码

AppDelegate.m AppDelegate.m

@import GoogleMaps;
#import "AppDelegate.h"

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
   [GMSServices provideAPIKey:@"AIzaSyCrCEb7qVkURIjq6jsfkPkwgN62sfj6Ff0"];
   return YES;
}

STEP 5:第 5 步:

ViewController.h视图控制器.h

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


@interface ViewController : UIViewController<CLLocationManagerDelegate,GMSMapViewDelegate>{
    CLLocation *currentLocation;
}

@property (strong, nonatomic) IBOutlet UIView *viewDirection;
@property (nonatomic, strong) CLLocationManager *locationManager;
@property (nonatomic, strong) GMSMapView *mapView;
@end

ViewController.m视图控制器.m

#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
@synthesize viewDirection,locationManager,
@synthesize mapView;

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    locationManager = [[CLLocationManager alloc]init];
    locationManager.delegate = self;
    locationManager.distanceFilter = 10;
    locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    if([CLLocationManager locationServicesEnabled] == NO){
        NSLog(@"Your location service is not enabled, So go to Settings > Location Services");
    }
    else{
        NSLog(@"Your location service is enabled");
    }
    if ([locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
       [locationManager requestWhenInUseAuthorization];
    }
    [locationManager startUpdatingLocation];
}

#pragma mark - CLLocationManagerDelegate method
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
    currentLocation = [locations lastObject];
    if (currentLocation != nil){
        NSLog(@"The latitude value is - %@",[NSString stringWithFormat:@"%.8f", currentLocation.coordinate.latitude]);
        NSLog(@"The logitude value is - %@",[NSString stringWithFormat:@"%.8f", currentLocation.coordinate.longitude]);
    }
    //Current
    GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:currentLocation.coordinate.latitude longitude: currentLocation.coordinate.longitude zoom:13];

    self.mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera];
    self.mapView.myLocationEnabled = YES;
    self.mapView.delegate = self;
    self.mapView.frame = viewDirection.bounds;
    [viewDirection addSubview:self.mapView];

    GMSMarker *marker = [[GMSMarker alloc] init];
    marker.position = CLLocationCoordinate2DMake(currentLocation.coordinate.latitude, currentLocation.coordinate.longitude);
    marker.title = @"Your Office Name";
    marker.icon = [UIImage imageNamed:@"boss-icon.png"];
                OR
    marker.icon = [GMSMarker markerImageWithColor:[UIColor blueColor]];
    marker.snippet = @"Current Location";
    marker.map = self.mapView;


    GMSMarker *marker1 = [[GMSMarker alloc] init];
    marker1.position = CLLocationCoordinate2DMake(22.7007,75.8759);
    marker1.icon = [GMSMarker markerImageWithColor:[UIColor redColor]];
    marker1.title = @"Place Name";
    marker1.snippet = @"City Name";
    marker1.map = self.mapView;


    GMSMarker *marker2 = [[GMSMarker alloc] init];
    marker2.position = CLLocationCoordinate2DMake(22.6990,75.8671);
    marker2.icon = [GMSMarker markerImageWithColor:[UIColor greenColor]];
    marker2.title = @"Place Name";
    marker2.snippet = @"City Name";
    marker2.map = self.mapView;

    NSString *originString = [NSString stringWithFormat:@"%f,%f",22.7007,75.8759];

    NSString *destinationString = [NSString stringWithFormat:@"%f,%f",22.6990,75.8671]; 

    NSString *str = [NSString stringWithFormat:@"http://maps.googleapis.com/maps/api/directions/json?origin=%@&destination=%@&sensor=false",originString,destinationString];
    NSURL *url=[[NSURL alloc]initWithString:[str stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]]];
    NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
    NSURLSessionDataTask * dataTask = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if(data == nil) {
            return;
        }else{
            NSDictionary* json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
            NSArray* latestRoutes = [json objectForKey:@"routes"];
            NSString *points=[[[latestRoutes objectAtIndex:0] objectForKey:@"overview_polyline"] objectForKey:@"points"];
            @try {
                // TODO: better parsing. Regular expression?
                NSArray *temp= [self decodePolyLine:[points mutableCopy]];
                GMSMutablePath *path = [GMSMutablePath path];
                for(int idx = 0; idx < [temp count]; idx++){
                    CLLocation *location=[temp objectAtIndex:idx];
                    [path addCoordinate:location.coordinate];
                }
                // create the polyline based on the array of points.
                GMSPolyline *rectangle = [GMSPolyline polylineWithPath:path];
                rectangle.strokeWidth=5.0;
                rectangle.map = self.mapView;
                [locationManager stopUpdatingLocation];
            }
            @catch (NSException * e) {
                // TODO: show erro
            }
        }
    }];
    [dataTask resume];
    }
    [locationManager stopUpdatingLocation];
}

//I called below method in above temp(NSArray *temp = [self decodePolyLine:[points mutableCopy]]) for Drawing route between two or more places
-(NSMutableArray *)decodePolyLine: (NSMutableString *)encoded {
    [encoded replaceOccurrencesOfString:@"\\\\" withString:@"\\"
                                options:NSLiteralSearch
                                  range:NSMakeRange(0, [encoded length])];
    NSInteger len = [encoded length];
    NSInteger index = 0;
    NSMutableArray *array = [[NSMutableArray alloc] init] ;
    NSInteger lat=0;
    NSInteger lng=0;
    while (index < len) {
        NSInteger b;
        NSInteger shift = 0;
        NSInteger result = 0;
        do {
            b = [encoded characterAtIndex:index++] - 63;
            result |= (b & 0x1f) << shift;
            shift += 5;
        } while (b >= 0x20);
        NSInteger dlat = ((result & 1) ? ~(result >> 1) : (result >> 1));
        lat += dlat;
        shift = 0;
        result = 0;
        do {
            b = [encoded characterAtIndex:index++] - 63;
            result |= (b & 0x1f) << shift;
            shift += 5;
        } while (b >= 0x20);
        NSInteger dlng = ((result & 1) ? ~(result >> 1) : (result >> 1));
        lng += dlng;
        NSNumber *latitude = [[NSNumber alloc] initWithFloat:lat * 1e-5] ;
        NSNumber *longitude = [[NSNumber alloc] initWithFloat:lng * 1e-5] ;
        printf("[%f,", [latitude doubleValue]);
        printf("%f]", [longitude doubleValue]);
        CLLocation *loc = [[CLLocation alloc] initWithLatitude:[latitude floatValue] longitude:[longitude floatValue]] ;
        [array addObject:loc];
    }

    return array;
}

@end

Happy Coding :-)快乐编码:-)

Add following lines in your info.plist在 info.plist 中添加以下几行

<key>NSLocationWhenInUseUsageDescription</key>
    <string>App required location because it is needed when .... </string>

Also check that you added following line in your code还要检查您是否在代码中添加了以下行

if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)])
    {
        [self.locationManager requestWhenInUseAuthorization];
    }

As suggested by others in their comments, you need one or 2 keys in your info.plist, and you need to ask the user for permission to use the GPS.正如其他人在他们的评论中所建议的那样,您的 info.plist 中需要一两个键,并且您需要向用户询问使用 GPS 的权限。 See this link for the code:有关代码,请参阅此链接:

Checking location service permission on iOS 在 iOS 上检查位置服务权限

The link below lists the keys you need to enter into your info.plist and the code you need, but the code is in Swift:下面的链接列出了你需要输入到 info.plist 中的键和你需要的代码,但代码是在 Swift 中的:

http://nshipster.com/core-location-in-ios-8/ http://nshipster.com/core-location-in-ios-8/

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

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