要使用
CLLocationManager
獲取定位的話浅碾,首先要引入系統(tǒng)框架CoreLocation.framework
,這個(gè)框架并不是默認(rèn)會(huì)引入的。
開始使用
第一步:定義一個(gè)屬性用來來記錄CLLocationManager對象
@property (nonatomic, strong) CLLocationManager *locationManager;
關(guān)于為什么一定要定義為屬性而不使用局部變量舞痰,是因?yàn)榫植孔兞康姆椒ńY(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)的字符串會(huì)出現(xiàn)在請求獲取定位服務(wù)授權(quán)的彈框里
第三步:開始定位
-(void)startGetLocation
{
if([CLLocationManager locationServicesEnabled])
{
// 開始時(shí)時(shí)定位
[self.locationManager startUpdatingLocation];
}
}
第四步:實(shí)現(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"];
// 強(qiáng)制 成 簡體中文
[[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"];
}];
}
因?yàn)楫a(chǎn)品要求取到的地理位置必須為中文给涕,所以這里我做了語言的強(qiáng)制轉(zhuǎn)換豺憔。
另外,關(guān)于CLPlacemark
的一些屬性定義够庙,我通過log找出了常用的幾個(gè)的對應(yīng)關(guān)系:
administrativeArea //省
locality // 市
subLocality // 區(qū)
thoroughfare // 街道
subThoroughfare // 子街道
網(wǎng)上很多網(wǎng)友都說四大直轄市的城市信息無法通過
locality
獲得恭应,只能通過獲取省份的方法來獲得,所以如果locality
為空的話耘眨,則可知為直轄市昼榛。但是我驗(yàn)證結(jié)果并不是這樣的呀,還專門找來了iOS7和iOS8的設(shè)備驗(yàn)證了一下剔难,直轄市的城市信息是可以通過locality
獲得胆屿。所以我上面判斷是否為直轄市是用對比locality
(市)和administrativeArea
(省)字符串是否相同來判斷的钥飞。
補(bǔ)充
因?yàn)橐恍?yàn)證莺掠,所以難免要用到模擬地理位置,關(guān)于模擬地理位置读宙,可以用下面的方法方便快捷的實(shí)現(xiàn)彻秆。
- 使用模擬器運(yùn)行你的APP
- 選擇 調(diào)試 > 位置 > 自定位置(屏幕左上角)
- 在彈出的窗口中,輸入你要模擬的地理位置的經(jīng)緯度
- 點(diǎn)擊確定,模擬位置完成(不放心的話可以去模擬器的map去看一下當(dāng)前位置)
- 在你的APP做相應(yīng)的操作唇兑,即可獲取你想要的數(shù)據(jù)
如何獲取經(jīng)緯度網(wǎng)上有很多方法酒朵,我用的是這個(gè):http://www.gpsspg.com/maps.htm
注意:我用的是9.2的模擬器,在使用的時(shí)候有一個(gè)問題扎附,就是設(shè)置完地址之后蔫耽,無法獲取到地理信息。這時(shí)候留夜,只需要先去蘋果溜一圈( 選擇 調(diào)試 > 位置 > 蘋果)再選擇自定位置重新設(shè)置的地址就可以了匙铡,也不知道是什么原因。