iOS系统自带定位,用CLLocationManager就能够轻松的实现定位的操做,得到的是一组经纬度,固然,也能够根据给出的经纬度获取相应的省份、城市、街道等信息,下面就看一个根据经纬度得到城市的demo:git
由于获取经纬度须要CLLocationManager类,而这个类包含在CoreLocation框架中,获取城市信息须要mapKit框架,因此须要首先在工程中导入这两个框架:框架
导入框架的步骤:选择1.target——2.Build Phases——3.Link Binary With Libraries ——4.点击“+”号:如图所示步骤:oop
点击加号以后在搜索框里输入相应的框架,便可搜索到,如图所示:post
下面就该写代码了,首先在视图控制器中导入:ui
1
2
|
#import <CoreLocation/CoreLocation.h>
#import <MapKit/MapKit.h>
|
两个头文件,而后.m中的具体代码以下:atom
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
#import "ANNViewController.h"
@interface ANNViewController ()
@property (strong, nonatomic) IBOutlet UILabel *longitude;
@property (strong, nonatomic) IBOutlet UILabel *latitude;
@property (strong, nonatomic) IBOutlet UILabel *location;
@property (strong, nonatomic) CLLocationManager *locationManager;
@end
@implementation ANNViewController
- (
void
)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.view.backgroundColor = [UIColor whiteColor];
//建立CLLocationManager对象
self.locationManager = [[CLLocationManager alloc] init];
//设置代理为本身
self.locationManager.delegate = self;
}
- (IBAction)locationButton:(UIButton *)sender {
[self.locationManager startUpdatingLocation];
}
- (
void
)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation
{
//将经度显示到label上
self.longitude.text = [NSString stringWithFormat:@
"%lf"
, newLocation.coordinate.longitude];
//将纬度现实到label上
self.latitude.text = [NSString stringWithFormat:@
"%lf"
, newLocation.coordinate.latitude];
// 获取当前所在的城市名
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
//根据经纬度反向地理编译出地址信息
[geocoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *array, NSError *error)
{
if
(array.count > 0)
{
CLPlacemark *placemark = [array objectAtIndex:0];
//将得到的全部信息显示到label上
self.location.text = placemark.name;
//获取城市
NSString *city = placemark.locality;
if
(!city) {
//四大直辖市的城市信息没法经过locality得到,只能经过获取省份的方法来得到(若是city为空,则可知为直辖市)
city = placemark.administrativeArea;
}
NSLog(@
"city = %@"
, city);
}
else
if
(error == nil && [array count] == 0)
{
NSLog(@
"No results were returned."
);
}
else
if
(error != nil)
{
NSLog(@
"An error occurred = %@"
, error);
}
}];
//系统会一直更新数据,直到选择中止更新,由于咱们只须要得到一次经纬度便可,因此获取以后就中止更新
[manager stopUpdatingLocation];
}
|
主要就是直辖市的城市得到须要拐个弯,iOS7添加了一个新的方法,代替了上面这个方法:spa
1
2
3
4
5
6
7
8
9
|
- (
void
)locationManager:(CLLocationManager *)manager
didUpdateLocations:(NSArray *)locations
{
NSLog(@
"longitude = %f"
, ((CLLocation *)[locations
lastObject]).coordinate.longitude);
NSLog(@
"latitude = %f"
, ((CLLocation *)[locations lastObject]).coordinate.latitude);
[manager stopUpdatingLocation];
}
|
后面的处理和上面的方法同样,你们能够看一下。代理
另外还有一些CLGeocoder的属性以下:rest
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
@property (nonatomic, readonly) NSDictionary *addressDictionary;
// address dictionary properties
@property (nonatomic, readonly) NSString *name;
// eg. Apple Inc.
@property (nonatomic, readonly) NSString *thoroughfare;
// street address, eg. 1 Infinite Loop
@property (nonatomic, readonly) NSString *subThoroughfare;
// eg. 1
@property (nonatomic, readonly) NSString *locality;
// city, eg. Cupertino
@property (nonatomic, readonly) NSString *subLocality;
// neighborhood, common name, eg. Mission District
@property (nonatomic, readonly) NSString *administrativeArea;
// state, eg. CA
@property (nonatomic, readonly) NSString *subAdministrativeArea;
// county, eg. Santa Clara
@property (nonatomic, readonly) NSString *postalCode;
// zip code, eg. 95014
@property (nonatomic, readonly) NSString *ISOcountryCode;
// eg. US
@property (nonatomic, readonly) NSString *country;
// eg. United States
@property (nonatomic, readonly) NSString *inlandWater;
// eg. Lake Tahoe
@property (nonatomic, readonly) NSString *ocean;
// eg. Pacific Ocean
@property (nonatomic, readonly) NSArray *areasOfInterest;
// eg. Golden Gate Park
|