转自:https://my.oschina.net/wangdk/blog/166792
其中desiredAccuracy属性表示精确度,有5种选择如下:
| |
kCLLocationAccuracyBest | 精确度最佳 |
kCLLocationAccuracyneare | 精确度10m以内 |
kCLLocationAccuracyHundr | 精确度100m以内 |
kCLLocationAccuracyKilom | 精确度1000m以内 |
kCLLocationAccuracyThree | 精确度3000m以内 |
NOTE:精确度越高,用点越多,就要根据实际情况而定。
// appDelgate.h
#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
#import <MapKit/MapKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate,CLLocationManagerDelegate,MKReverseGeocoderDelegate>
@property (strong, nonatomic) UIWindow *window;
@end
//
// AppDelegate.m
// location
//
// Copyright (c) 2013年 TestApp. All rights reserved.
//
#import "AppDelegate.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
UIButton *button = [UIButton buttonWithType:UIButtonTypeContactAdd];
button.frame = CGRectMake(0, 100, 100, 30);
[button setTitle:@"定位" forState:UIControlStateNormal];
[button addTarget:self action:@selector(test) forControlEvents:UIControlEventTouchUpInside];
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 150, 320, 30)];
label.tag = 101;
label.text = @"等待定位中....";
[self.window addSubview:label];
[label release];
[self.window addSubview:button];
return YES;
}
-(void) test {
CLLocationManager *locationManager = [[CLLocationManager alloc] init];
// 设置定位精度,十米,百米,最好
[locationManager setDesiredAccuracy:kCLLocationAccuracyNearestTenMeters];
locationManager.delegate = self;
// 开始时时定位
[locationManager startUpdatingLocation];
}
// 错误信息
-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
NSLog(@"error");
}
// 6.0 以上调用这个函数
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
NSLog(@"%d", [locations count]);
CLLocation *newLocation = locations[0];
CLLocationCoordinate2D oldCoordinate = newLocation.coordinate;
NSLog(@"旧的经度:%f,旧的纬度:%f",oldCoordinate.longitude,oldCoordinate.latitude);
// CLLocation *newLocation = locations[1];
// CLLocationCoordinate2D newCoordinate = newLocation.coordinate;
// NSLog(@"经度:%f,纬度:%f",newCoordinate.longitude,newCoordinate.latitude);
// 计算两个坐标距离
// float distance = [newLocation distanceFromLocation:oldLocation];
// NSLog(@"%f",distance);
[manager stopUpdatingLocation];
//------------------位置反编码---5.0之后使用-----------------
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder reverseGeocodeLocation:newLocation
completionHandler:^(NSArray *placemarks, NSError *error){
for (CLPlacemark *place in placemarks) {
UILabel *label = (UILabel *)[self.window viewWithTag:101];
label.text = place.name;
NSLog(@"name,%@",place.name); // 位置名
// NSLog(@"thoroughfare,%@",place.thoroughfare); // 街道
// NSLog(@"subThoroughfare,%@",place.subThoroughfare); // 子街道
// NSLog(@"locality,%@",place.locality); // 市
// NSLog(@"subLocality,%@",place.subLocality); // 区
// NSLog(@"country,%@",place.country); // 国家
// administrativeArea //省
}
}];
}
// 6.0 调用此函数
-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
NSLog(@"%@", @"ok");
}
@end
iOS 8.0 获取权限 if ([[[UIDevice currentDevice]systemVersion]floatValue] >= 8.0) {
[self.locationManager requestWhenInUseAuthorization];
}