CLLocationManager獲取地理位置信息

要使用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)的字段。

plist文件添加相應(yīng)字段.png

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


請求獲取定位服務(wù)授權(quán)彈框.png

第三步:開始定位

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

  1. 使用模擬器運行你的APP
  2. 選擇 調(diào)試 > 位置 > 自定位置(屏幕左上角)
  3. 在彈出的窗口中,輸入你要模擬的地理位置的經(jīng)緯度
  4. 點擊確定,模擬位置完成(不放心的話可以去模擬器的map去看一下當(dāng)前位置)
  5. 在你的APP做相應(yīng)的操作,即可獲取你想要的數(shù)據(jù)

如何獲取經(jīng)緯度網(wǎng)上有很多方法,我用的是這個:http://www.gpsspg.com/maps.htm

注意:我用的是9.2的模擬器,在使用的時候有一個問題,就是設(shè)置完地址之后,無法獲取到地理信息。這時候,只需要先去蘋果溜一圈( 選擇 調(diào)試 > 位置 > 蘋果)再選擇自定位置重新設(shè)置的地址就可以了,也不知道是什么原因。

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

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

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