CLLocationManager獲取地理位置信息

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

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

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


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

第三步:開始定位

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

  1. 使用模擬器運(yùn)行你的APP
  2. 選擇 調(diào)試 > 位置 > 自定位置(屏幕左上角)
  3. 在彈出的窗口中,輸入你要模擬的地理位置的經(jīng)緯度
  4. 點(diǎn)擊確定,模擬位置完成(不放心的話可以去模擬器的map去看一下當(dāng)前位置)
  5. 在你的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è)置的地址就可以了匙铡,也不知道是什么原因。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末碍粥,一起剝皮案震驚了整個(gè)濱河市鳖眼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嚼摩,老刑警劉巖钦讳,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異枕面,居然都是意外死亡愿卒,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門潮秘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來琼开,“玉大人,你說我怎么就攤上這事唇跨〕硗ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵买猖,是天一觀的道長改橘。 經(jīng)常有香客問我,道長玉控,這世上最難降的妖魔是什么飞主? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮高诺,結(jié)果婚禮上碌识,老公的妹妹穿的比我還像新娘。我一直安慰自己虱而,他們只是感情好筏餐,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著牡拇,像睡著了一般魁瞪。 火紅的嫁衣襯著肌膚如雪穆律。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天导俘,我揣著相機(jī)與錄音峦耘,去河邊找鬼。 笑死旅薄,一個(gè)胖子當(dāng)著我的面吹牛辅髓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播少梁,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼洛口,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了凯沪?” 一聲冷哼從身側(cè)響起绍弟,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎著洼,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體而叼,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡身笤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了葵陵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片液荸。...
    茶點(diǎn)故事閱讀 40,561評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖脱篙,靈堂內(nèi)的尸體忽然破棺而出娇钱,到底是詐尸還是另有隱情,我是刑警寧澤绊困,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布文搂,位于F島的核電站,受9級(jí)特大地震影響秤朗,放射性物質(zhì)發(fā)生泄漏煤蹭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一取视、第九天 我趴在偏房一處隱蔽的房頂上張望硝皂。 院中可真熱鬧,春花似錦作谭、人聲如沸稽物。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贝或。三九已至吼过,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間傀缩,已是汗流浹背那先。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赡艰,地道東北人售淡。 一個(gè)月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像慷垮,于是被迫代替她去往敵國和親揖闸。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容