要使用
CLLocationManager獲取定位的話,首先要引入系統(tǒng)框架CoreLocation.framework
,這個框架并不是默認會引入的。
開始使用
第一步:定義一個屬性用來來記錄CLLocationManager對象
@property (nonatomic, strong) CLLocationManager *locationManager;
關(guān)于為什么一定要定義為屬性而不使用局部變量,是因為局部變量的方法結(jié)束它就被銷毀了。
第二步:get方法定義locationManager屬性
-(CLLocationManager *)locationManager
{
if (_locationManager == nil) {
_locationManager = [[CLLocationManager alloc] init];
// 設(shè)置定位精度
[_locationManager setDesiredAccuracy:kCLLocationAccuracyNearestTenMeters];
_locationManager.delegate = self;
if (iOS8) {//ios8.0以上版本CLLocationManager定位服務(wù)需要授權(quán)
[_locationManager requestWhenInUseAuthorization];
}
}
return _locationManager;
}
注意:iOS8.0及其以上版本CLLocationManager定位服務(wù)需要授權(quán),所以要加上相應(yīng)的requestWhenInUseAuthorization或者NSLocationAlwaysUsageDescription授權(quán)請求,并在plist文件里添加相應(yīng)的字段。

對應(yīng)的字符串會出現(xiàn)在請求獲取定位服務(wù)授權(quán)的彈框里

第三步:開始定位
-(void)startGetLocation
{
if([CLLocationManager locationServicesEnabled])
{
// 開始時時定位
[self.locationManager startUpdatingLocation];
}
}
第四步:實現(xiàn)代理,獲取數(shù)據(jù)
-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
//定位失敗,作相應(yīng)處理。
}
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
CLLocation *newLocation = locations[0];
[manager stopUpdatingLocation];//取到定位即可停止刷新,沒有必要一直刷新,耗電。
// 保存 Device 的現(xiàn)語言
NSMutableArray *userDefaultLanguages = [[NSUserDefaults standardUserDefaults]
objectForKey:@"AppleLanguages"];
// 強制 成 簡體中文
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"zh-hans",nil]
forKey:@"AppleLanguages"];
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder reverseGeocodeLocation:newLocation
completionHandler:^(NSArray *placemarks, NSError *error){
if(!error){
for (CLPlacemark *place in placemarks) {
NSString *city = place.locality;
NSString *administrativeArea = place.administrativeArea;
if ([city isEqualToString:administrativeArea]) {
//四大直轄市
self.addressString = [NSString stringWithFormat:@"%@%@",city,place.subLocality];
}else{
self.addressString = [NSString stringWithFormat:@"%@%@",administrativeArea,city];
}
break;
}
}
// 還原Device 的語言
[[NSUserDefaults standardUserDefaults] setObject:userDefaultLanguages forKey:@"AppleLanguages"];
}];
}
因為產(chǎn)品要求取到的地理位置必須為中文,所以這里我做了語言的強制轉(zhuǎn)換。
另外,關(guān)于CLPlacemark的一些屬性定義,我通過log找出了常用的幾個的對應(yīng)關(guān)系:
administrativeArea //省
locality // 市
subLocality // 區(qū)
thoroughfare // 街道
subThoroughfare // 子街道
網(wǎng)上很多網(wǎng)友都說四大直轄市的城市信息無法通過
locality獲得,只能通過獲取省份的方法來獲得,所以如果locality為空的話,則可知為直轄市。但是我驗證結(jié)果并不是這樣的呀,還專門找來了iOS7和iOS8的設(shè)備驗證了一下,直轄市的城市信息是可以通過locality獲得。所以我上面判斷是否為直轄市是用對比locality(市)和administrativeArea(?。┳址欠裣嗤瑏砼袛嗟?。
補充
因為要一些驗證,所以難免要用到模擬地理位置,關(guān)于模擬地理位置,可以用下面的方法方便快捷的實現(xiàn)。
- 使用模擬器運行你的APP
- 選擇 調(diào)試 > 位置 > 自定位置(屏幕左上角)
- 在彈出的窗口中,輸入你要模擬的地理位置的經(jīng)緯度
- 點擊確定,模擬位置完成(不放心的話可以去模擬器的map去看一下當(dāng)前位置)
- 在你的APP做相應(yīng)的操作,即可獲取你想要的數(shù)據(jù)
如何獲取經(jīng)緯度網(wǎng)上有很多方法,我用的是這個:http://www.gpsspg.com/maps.htm
注意:我用的是9.2的模擬器,在使用的時候有一個問題,就是設(shè)置完地址之后,無法獲取到地理信息。這時候,只需要先去蘋果溜一圈( 選擇 調(diào)試 > 位置 > 蘋果)再選擇自定位置重新設(shè)置的地址就可以了,也不知道是什么原因。