iOS定位獲取當前所在經緯度,進而獲得具體地址

iOS定位獲取當前所在經緯度,進而獲得具體地址(省市地區街道)


前言: 今天做iOS項目的時候,需要通過定位來拿到當期城市的名稱。百度地圖SDK有這個功能,但為了不依賴第三方,這里我用iOS自帶框架CoreLocation來實現這個需求。iOS8出來之后,針對定位需要多一點處理,才可以正常定位,這點會在文章末尾部分作出補充,在聲明補充之前的部分都是默認iOS7處理。首先,我們需要在工程中導入CoreLocation系統框架。然后在我們的控制器中引入頭文件。#import然后,聲明一個CLLocationManager對象作為成員變量,用于定位獲取經緯度坐標,并遵守協議CLLocationManager的協議。@interface TYViewController (){

CLLocationManager *_locationManager;

}

實現其中的代理方法。

- (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);

_cityLable.text = city;

[_cityButton setTitle:city forState:UIControlStateNormal];

}

else if (error == nil && [array count] == 0)

{

NSLog(@"No results were returned.");

}

else if (error != nil)

{

NSLog(@"An error occurred = %@", error);

}

}];

//系統會一直更新數據,直到選擇停止更新,因為我們只需要獲得一次經緯度即可,所以獲取之后就停止更新

[manager stopUpdatingLocation];

}

最后在viewDidLoad中初始化定位管理器。

- (void)viewDidLoad

{

[super viewDidLoad];

[self initializeLocationService];

// Do any additional setup after loading the view.

}

- (void)initializeLocationService {

// 初始化定位管理器

_locationManager = [[CLLocationManager alloc] init];

// 設置代理

_locationManager.delegate = self;

// 設置定位精確度到米

_locationManager.desiredAccuracy = kCLLocationAccuracyBest;

// 設置過濾器為無

_locationManager.distanceFilter = kCLDistanceFilterNone;

// 開始定位

[_locationManager startUpdatingLocation];

}

接下來編譯并運行程序,手動在iOS模擬器上配置定位坐標,即可打印出該經緯度坐標對應的城市名(真機可直接打印出當前城市名)。

CLPlacemark類中封裝了很多的地理信息屬性,包括完整的地址(大到國家,小到街道)和地理名稱等等,可以酌情使用。

PS:如果定位出的街道信息為英文,那請先處理本地化,同時模擬器調整語言為中文。

以下為針對iOS8的補充:

如果需要正常定位,相對iOS7而言,iOS8需要額外處理兩個地方。

1. 工程的plist文件里面添加兩個字段:NSLocationAlwaysUsageDescription,NSLocationWhenInUseUsageDescription,type類型均為string,值可以根據你的需要填寫(也可以不填),填寫的內容會展示在APP提示用戶是否允許定位的alert內容里面,具體效果可以自行測試,這里就不額外截圖。

2. 調用定位方法之前需要額外調用一個函數,直接在上面iOS7初始化定位服務的方法里面修改即可,具體如下:

- (void)initializeLocationService {

// 初始化定位管理器

_locationManager = [[CLLocationManager alloc] init];

// 設置代理

_locationManager.delegate = self;

// 設置定位精確度到米

_locationManager.desiredAccuracy = kCLLocationAccuracyBest;

// 設置過濾器為無

_locationManager.distanceFilter = kCLDistanceFilterNone;

// 開始定位

// 取得定位權限,有兩個方法,取決于你的定位使用情況

// 一個是requestAlwaysAuthorization,一個是requestWhenInUseAuthorization

[_locationManager requestAlwaysAuthorization];//這句話ios8以上版本使用。

[_locationManager startUpdatingLocation];

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容