iOS開發日記49-詳解定位CLLocation,49-cllocation
今天博主有一個定位CLLocation的需求,遇到了一些困痛點,在此和大家分享,希望能夠共同進步.
使用定位功能,首先要匯入架構,遵守CLLocationManagerDelegate協議,再建立位置管理器CLLocationManager
在iOS8.0後,定位功能需要在info.plist中加入NSLocationWhenInUseUsageDescription和NSLocationAlwaysUsageDescription這兩個NSString類型欄位,才能夠使用定位功能
代碼貼出來與大家共勉,各位看官自行研究
{
self.locationManager = [[CLLocationManager alloc] init];
_locationManager.delegate = self;
if([CLLocationManager locationServicesEnabled] == NO) {
// NSLog(@"沒有GPS服務");
}
//地理位置精確度
_locationManager.desiredAccuracy=kCLLocationAccuracyNearestTenMeters;
//設定距離篩選器,double類型,只要距離變化多少,就調用委託代理
self.locationManager.distanceFilter = kCLDistanceFilterNone; // meters
[_locationManager requestWhenInUseAuthorization];// 前台定位
[_locationManager startUpdatingLocation];
}
- (void)locationManager:(CLLocationManager *)manager
didUpdateLocations:(NSArray *)locations
{
NSLog(@"longitude = %f", ((CLLocation *)[locations
lastObject]).coordinate.longitude);
NSLog(@"latitude = %f", ((CLLocation *)[locations lastObject]).coordinate.latitude);
CGFloat longTI=((CLLocation *)[locations
lastObject]).coordinate.longitude;
CGFloat latTI=((CLLocation *)[locations lastObject]).coordinate.latitude;
//將經度顯示到label上
_longitudeLabel.text = [NSString stringWithFormat:@"%f",longTI];
//將緯度現實到label上
_latitudeLabel.text = [NSString stringWithFormat:@"%f",latTI];
// 擷取當前所在的城市名
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
//根據經緯度反向地理編譯出地址資訊
[geocoder reverseGeocodeLocation:locations.lastObject 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);
_cityName=city;
}
else if (error == nil && [array count] == 0)
{
// NSLog(@"No results were returned.");
}
else if (error != nil)
{
// NSLog(@"An error occurred = %@", error);
}
}];
//系統會一直更新資料,直到選擇停止更新,因為我們只需要獲得一次經緯度即可,所以擷取之後就停止更新
[manager stopUpdatingLocation];
}