IOS定位功能的實現(xiàn)

今天做iOS項目的時候,需要通過定位來拿到當期城市的名稱。百度地圖SDK有這個功能,但為了不依賴第三方,這里我用iOS自帶框架CoreLocation來實現(xiàn)這個需求。iOS8出來之后,針對定位需要多一點處理,才可以正常定位,這點會在文章末尾部分作出補充,在聲明補充之前的部分都是默認iOS7處理。

首先,我們需要在工程中導入CoreLocation系統(tǒng)框架。然后在我們的控制器中引入頭文件。

#import <CoreLocation/CoreLocation.h>

然后,聲明一個CLLocationManager對象作為成員變量,用于定位獲取經(jīng)緯度坐標,并遵守協(xié)議CLLocationManager的協(xié)議。

@interface TYViewController () {

CLLocationManager *_locationManager;

}

實現(xiàn)其中的代理方法。

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{

//將經(jīng)度顯示到label上

self.longitude.text = [NSString stringWithFormat:@"%lf", newLocation.coordinate.longitude];

//將緯度現(xiàn)實到label上

self.latitude.text = [NSString stringWithFormat:@"%lf", newLocation.coordinate.latitude];

// 獲取當前所在的城市名

CLGeocoder *geocoder = [[CLGeocoder alloc] init];

//根據(jù)經(jīng)緯度反向地理編譯出地址信息

[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];

}

elseif(error == nil && [array count] == 0)

{

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

}

elseif(error != nil)

{

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

}

}];

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

[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模擬器上配置定位坐標,即可打印出該經(jīng)緯度坐標對應的城市名(真機可直接打印出當前城市名)。

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

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

以下為針對iOS8的補充:

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

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

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

- (void)initializeLocationService {

// 初始化定位管理器

_locationManager = [[CLLocationManager alloc] init];

// 設置代理

_locationManager.delegate = self;

// 設置定位精確度到米

_locationManager.desiredAccuracy = kCLLocationAccuracyBest;

// 設置過濾器為無

_locationManager.distanceFilter = kCLDistanceFilterNone;

// 開始定位

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

// 一個是requestAlwaysAuthorization,一個是requestWhenInUseAuthorization

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

[_locationManager startUpdatingLocation];

}



注意:這個需要真機測試


文章鏈接:本文地址:http://blog.it985.com/13173.html

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容