Core Location Framework詳解(一)如何獲取你當前的定位坐標

相關知識點 CLLocationManager CLAuthorizationStatus Accuracy Constants distanceFilter CLActivityType
開發(fā)環(huán)境 iOS 8.4 Xcode 6.4
API地址

簡述

The Core Location framework lets you determine the current location or heading associated with a device. The framework uses the available hardware to determine the user’s position and heading. You use the classes and protocols in this framework to configure and schedule the delivery of location and heading events. You can also use it to define geographic regions and monitor when the user crosses the boundaries of those regions. In iOS, you can also define a region around a Bluetooth beacon.

根據(jù)蘋果官方文檔的描述虎囚,Core Location Framework的用途是使用戶通過移動設備來獲取定位信息和方向信息谦秧,還有你的范圍,當用戶走過某些范圍邊界就能馬上監(jiān)控到阵面,在iOS上绣否,甚至可以連同beacon聯(lián)動來確定周邊信息誊涯。

現(xiàn)在我主要是通過一些案例來學習這個Framework積累經(jīng)驗,寫得不好的話蒜撮,麻煩吐槽


開始——

首先新建一個項目,這篇文件是講Core Location Framework暴构,那當然要引入這個Framework,引入后我們在新建項目的ViewController.h引入這個框架ViewController.m引入#import <CoreLocation/CoreLocation.h>并且添加CLLocationManagerDelegate

Paste_Image.png

然后按著Command點擊<CoreLocation/CoreLocation.h>,進入看看框架里面的內(nèi)容,里面就包含了以下這些Class

Paste_Image.png

viewDidLoad函數(shù)里面取逾,我們添加以下這段代碼

    /************ 初始化地理位置~begin **************/

    if (locationManager == nil){
        locationManager                 = [[CLLocationManager alloc] init];
        
        //要求的精準度
        locationManager.desiredAccuracy = kCLLocationAccuracyBest;
        
        //設置最小距離范圍數(shù)據(jù)更新耗绿,單位為米,例如:10.0f為如果水平移動超過10米范圍則會更新地理位置信息
        locationManager.distanceFilter  = 10.0f;
        
        /**
         *  @author 老區(qū)
         *
         *  這個值是和更新位置信息有關砾隅,當一定時間范圍內(nèi)沒有檢測用戶的位置變化的話缭乘,則自動暫停位置服務,等到位置發(fā)生變化后才喚醒琉用,這個目的是為了節(jié)省系統(tǒng)電量
         *  默認值為CLActivityTypeOther
         *  CLActivityTypeAutomotiveNavigation, // 汽車使用
         *  CLActivityTypeFitness,    // 徒步使用
         *  CLActivityTypeOtherNavigation   // 船,火車策幼,飛機使用
         */
        locationManager.activityType    = CLActivityTypeAutomotiveNavigation;
        
        locationManager.delegate        = self;
    }

    
    //檢查授權邑时,如果沒有這句判斷的話在iOS執(zhí)行會直接出現(xiàn)"unknown selector"
    if ([locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
        [locationManager requestAlwaysAuthorization];//for iOS 8
    }

    
    //獲取地址位置
    [locationManager startUpdatingLocation];

    /************ 初始化地理位置~end **************/


CLLocationManager

The CLLocationManager
class is the central point for configuring the delivery of location- and heading-related events to your app. You use an instance of this class to establish the parameters that determine when location and heading events should be delivered and to start and stop the actual delivery of those events. You can also use a location manager object to retrieve the most recent location and heading data.

這里意思是傳遞location和heading相關事件到APP上顯示。還有就是控制開啟和關閉獲取地址位置信息和數(shù)據(jù)特姐,取回之前的位置和方向數(shù)據(jù)晶丘。

這里有幾點要注意的地方,就是使用CLLocationManager會詢問獲取定位功能的授權Requesting Permission to Use Location Services,我們可以根據(jù)[Constants]CLAuthorizationStatus來查看其授權狀態(tài)唐含,


CLAuthorizationStatus(授權狀態(tài) )

這里分別有以下幾種授權狀態(tài)——

  • kCLAuthorizationStatusNotDetermined——第一次安裝應用的時候用戶還沒選擇是否使用定位服務功能

  • kCLAuthorizationStatusRestricted——這個App的定位服務功能受限浅浮,用戶無法改變這個App的狀態(tài),有可能是由于開啟某些限制例如家長控制之類的操作

  • kCLAuthorizationStatusDenied——用戶明細地拒絕此App使用定位服務功能或者在用戶設置那里禁用定位服務

  • kCLAuthorizationStatusAuthorizedAlways——該APP授權在App任何時候包括前端運行和后端運行使用定位服務

  • kCLAuthorizationStatusAuthorizedWhenInUse——該APP授權在App前端運行的時候使用定位服務

其中這里的兩種授權狀態(tài)WhenInUseAlways都能獲取定位服務信息捷枯,但WhenInUse只允許用戶在App在foreground(前臺運行)狀態(tài)下才能獲取位置數(shù)據(jù)滚秩,而Always是任何時候,包括在foreground和background狀態(tài)下都能獲取到數(shù)據(jù)

重要:如果是iOS 8或之后淮捆,你還需要添加 NSLocationWhenInUseUsageDescription和NSLocationAlwaysUsageDescription到Info.plist上才會彈出授權提示

    
    //檢查授權郁油,如果沒有這句判斷的話在iOS執(zhí)行會直接出現(xiàn)"unknown selector"
    if ([locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
        [locationManager requestAlwaysAuthorization];//for iOS 8
    }

注意:如果您是先使用requestWhenInUseAuthorization來獲取授權的話,之后再使用requestAlwaysAuthorization獲取授權的話攀痊,會彈出提示用戶變更授權狀態(tài)桐腌,但反過來則不行,我認為是Always這個授權是高于WhenInUse苟径,如果你真的要將Always改為WhenInUse的話案站,則可以通過Setting那里去設置


Accuracy Constants

        //要求的精準度
        locationManager.desiredAccuracy = kCLLocationAccuracyBest;

這里我大概截了下圖片,知道有哪些常量就OK

Paste_Image.png

CLActivityType

相關代碼說明:

        /**
         *  @author 老區(qū)
         *
         *  這個值是和更新位置信息有關棘街,當一定時間范圍內(nèi)沒有檢測用戶的位置變化的話蟆盐,則自動暫停位置服務,等到位置發(fā)生變化后才喚醒蹬碧,這個目的是為了節(jié)省系統(tǒng)電量
         *  默認值為CLActivityTypeOther
         *  CLActivityTypeAutomotiveNavigation, // 汽車使用
         *  CLActivityTypeFitness,    // 徒步使用
         *  CLActivityTypeOtherNavigation   // 船舱禽,火車,飛機使用
         */
        locationManager.activityType    = CLActivityTypeOther;

Paste_Image.png

distanceFilter

        //設置最小距離范圍數(shù)據(jù)更新恩沽,單位為米誊稚,例如:10.0f為如果水平移動超過10米范圍則會更新地理位置信息
        locationManager.distanceFilter  = 10.0f;

其中還有一個kCLDistanceFilterNone,這個常量的意思是沒有任何范圍限制,只要位置發(fā)生任何變化都執(zhí)行更新,但這樣會很耗電



最后——

這些都準備好之后執(zhí)行startUpdatingLocation來獲取定位信息

[locationManager startUpdatingLocation];

當成功授權后里伯,便可以通過- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations這個Delegate來獲取位置數(shù)據(jù)

#pragma mark - CLLocationManagerDelegate

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    CLLocation *newLocation = [locations lastObject];
    
    NSLog(@"newLocation lat:%f", newLocation.coordinate.latitude);
    NSLog(@"newLocation lng:%f", newLocation.coordinate.longitude);
}

相關參考文章:
http://nevan.net/2014/09/core-location-manager-changes-in-ios-8/


原創(chuàng)作者:老區(qū)
Email: leo.au@foxmail.com
QQ:81508056
微信ID:kingOU

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末城瞎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子疾瓮,更是在濱河造成了極大的恐慌脖镀,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狼电,死亡現(xiàn)場離奇詭異蜒灰,居然都是意外死亡,警方通過查閱死者的電腦和手機肩碟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門强窖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人削祈,你說我怎么就攤上這事翅溺。” “怎么了髓抑?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵咙崎,是天一觀的道長。 經(jīng)常有香客問我吨拍,道長褪猛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任密末,我火速辦了婚禮握爷,結果婚禮上,老公的妹妹穿的比我還像新娘严里。我一直安慰自己新啼,他們只是感情好,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布刹碾。 她就那樣靜靜地躺著燥撞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪迷帜。 梳的紋絲不亂的頭發(fā)上物舒,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機與錄音戏锹,去河邊找鬼冠胯。 笑死,一個胖子當著我的面吹牛锦针,可吹牛的內(nèi)容都是我干的荠察。 我是一名探鬼主播置蜀,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼悉盆!你這毒婦竟也來了盯荤?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤焕盟,失蹤者是張志新(化名)和其女友劉穎秋秤,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體脚翘,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡灼卢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了来农。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芥玉。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖备图,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情赶袄,我是刑警寧澤揽涮,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站饿肺,受9級特大地震影響蒋困,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜敬辣,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一雪标、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧溉跃,春花似錦村刨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至龄糊,卻和暖如春逆粹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背炫惩。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工僻弹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人他嚷。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓蹋绽,卻偏偏與公主長得像芭毙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蟋字,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

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