CoreLocation(定位)

題外話:

  • 在移動互聯網時代,移動app能解決用戶的很多生活瑣事,比如

    • 導航:去任意陌生的地方
    • 周邊:找餐館,找酒店,找銀行,找電影院
  • 在上述應用中都用到了地圖定位功能,在iOS開發中,要想加入這2大功能,必須基于2個框架進行開發

    • Map Kit :用于地圖展示
    • Core Location:用于地理定位
  • 兩個專業術語:

    • LBS :Location Based Service (基于定位的服務)
    • SoloMo : Social Local mobile (所羅門)

1.CoreLocation框架的使用

  • CoreLocation框架使用的前提

  • 導入框架(需要注意的Xcode5以后不需要手動導入,以前需要手動導入)

  • 導入頭文件 #import <CoreLocation/CoreLocation.h>

  • 1.CoreLocation框架使用須知

  • 2.CoreLocation框架中所有的數據類型的前綴都是CL

  • 3.CoreLocation 中使用CLLocationManger 對象來做用戶定位

  • 最主要的5步(不要怕,很簡單,相信我,試著敲下來)

    1.創建CoreLocation 管理者(最好采用懶加載,管理者對象永遠不死)

    -(CLLocationManager *)locationManger
    {
           if (!_locationManger) {
      
           //1.創建CoreLocation 管理者
             _locationManger = [[CLLocationManager alloc]init];
        }
    
      return _locationManger;
    
    }
    

    2.成為CoreLocation 管理者的代理監聽獲取到的位置(遵守協議)

      self.locationManger.delegate = self;
    

    3.定位授權,還需要在在info.plist里面進行配置(僅僅在大于等于ios8里面才要求用戶主動授權,這是出于對安全性的要求)

     //授權(這是一個方法)
    
     if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) {
      
        NSLog(@"是ios8");
       //主動要求用戶對我們的程序授權,授權狀態改變就會通知代理
       [self.locationManger requestAlwaysAuthorization];//請求前臺和后臺定位權限
      //[self.locationManger requestWhenInUseAuthorization];//請求前臺定位權限
    
    }
    else
      {
          NSLog(@"不是iOS8");
      }
    

** 配置的方法:點擊 requestAlwaysAuthorization **

*配置的方法*

4.開始監聽(開始獲取位置)

[self.locationManger startUpdatingLocation];

NSLog(@"開始定位");

5.實現代理方法

   /*
*  獲取到位置信息之后就會被調用
*
*  @param manger   觸發事件的對象
*
*  @param locations  獲取到的位置
*/

//這步操作是很耗電的(一定要設置定位暫停)
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
{

    NSLog(@"%s",__func__);

    [self.locationManger stopUpdatingLocation];

    NSLog(@"定位結束");

}

對于上面其他的一些設置

1.設置獲取位置的精確度
如:self.locationManger.distanceFilter = kCLLocationAccuracyNearestTenMeters;

   kCLLocationAccuracyBestForNavigation 
   kCLLocationAccuracyBest;
   kCLLocationAccuracyNearestTenMeters;
   kCLLocationAccuracyHundredMeters;
   kCLLocationAccuracyKilometer;
   kCLLocationAccuracyThreeKilometers;

2.設置多久距離獲取一次location

self.locationManger.distanceFilter = 500; //filter |?f?lt?(r) 過濾

3.何時開啟定位?(獲取權限之后)

  -(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{

/*
    //1.用戶從未選擇過授權
    kCLAuthorizationStatusNotDetermined = 0
    //2.無法使用定位服務,該狀態用戶無法改變
    kCLAuthorizationStatusRestricted
    //3.用戶拒絕該應用定服務,或是定位服務總開關出于關閉狀態
    kCLAuthorizationStatusDenied
    //4.已經授權(廢棄)
    kCLAuthorizationStatusAuthorized
    //5.用戶允許該程序無論何時都可以使用地理信息
    kCLAuthorizationStatusAuthorizedAlways
    //6.用戶同意程序在可見時使用地理位置
    kCLAuthorizationStatusAuthorizedWhenInUse
 
    ****"最主要是后兩個:定位成功"******
 */

    if (status == kCLAuthorizationStatusNotDetermined) {
    
          NSLog(@"等待用戶授權");
    }else if (status == kCLAuthorizationStatusAuthorizedAlways || status == kCLAuthorizationStatusAuthorizedWhenInUse)
    {

          NSLog(@"授權成功");
    
         //4.開始監聽(開始獲取位置)
    
         [self.locationManger startUpdatingLocation];
    
         NSLog(@"開始定位");

   }else
    {
         NSLog(@"授權失敗");

    }

}

2.打印定位信息

latitude |?l?t?tju?d, American -tu?d| 緯度
longitude |?l?nd??tju?d, American ?l??nd??tu?d| 經度
degree |d??gri?| 度
coordinate |k?????d?n?t |noun 坐標

   //7.監聽定位信息

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
{

 CWLog(@"%s",__func__);

//8.獲取CLLocation對象(獲取用戶最后一次的位置)
/*
 
 location.coordinate; 坐標,包含經緯度
 location.altitude;設置海拔高度,單位是米
 location.course;設置前進方向 0表示北 90東  180南  270西 
 location.horizontalAccuracy; 水平精準度
 location.verticalAccuracy;  垂直精準度
 location.timeatamp;定位信息返回的時間
 location.speed; 設備移動速度 單位是米/秒 ,適于行車速度而不太適于步行

 */
 /*
  可以設置模擬器的速度
  bicycle ride  騎車速度
  run 跑步
  freeway drive  告訴公路駕車
  */

CLLocation *location = [locations lastObject];

NSLog(@"經度=%f 緯度=%f  speed = %f",location.coordinate.latitude,location.coordinate.longitude,location.speed);

//如果只需要獲取一次,可以獲取到位置之后就停止
 //[self.locationManager stopUpdatingLocation];

 CWLog(@"關閉定位");
}

3.回顧一下CLLocationManger 的常用操作

  • 1.開始用戶定位
    -(void)startUpdatingLocation;

  • 2.停止用戶定位
    -(void)stopUpdatingLocation;

  • 當用戶調用了startUpdatingLocation的方法之后,就開始不斷地定位用戶的位置,中途會頻繁的調用代理的下面方法
    -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations

location 參數里面裝著CLLocation的對象

CLLocation的一些屬性

4.有關-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations方法里面的一些操作(做一個類似導航的東西,界面自己布局)

聲明

//上一次的位置
@property(nonatomic,strong)CLLocation *previousLocation;//previous |?pri?v??s| 先前的
//計算總的距離
@property(nonatomic,assign)CLLocationDistance sumDistance;
//記錄總時間
@property(nonatomic,assign)NSTimeInterval sumTime;

方法的實現

 //6.定位調用

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
{

CWLog(@"定位信息打印");


/*  CLLocation 屬性
    
 timestap  獲取到當前位置信息的時間
 
 */

/*
    獲取走了多遠(用這一次的位置減去上一次的時間)
    獲取走這段路花了多長時間(這一次的時間減去上一次的時間)
    獲取速度(走了多遠 / 花了多少時間)
    獲取總共走的路程 (把每次獲取到走了多遠累加起來)
    獲取平均速度  (總路程 / 總時間)
 */

CLLocation *newlocation = [locations lastObject];

if (self.previousLocation != nil) {
    
    //計算兩次的距離(單位是米)
    
   CLLocationDistance distance = [newlocation distanceFromLocation:self.previousLocation];
    
    //計算兩次之間的時間(單位是秒)
    
   NSTimeInterval dTime = [newlocation.timestamp timeIntervalSinceDate:self.previousLocation.timestamp];
    
    //計算速度(米/秒)
    
    CGFloat speed = distance/dTime;
    
    CWLog(@"距離=%f 時間=%f 速度=%f ",distance,dTime,speed);
    
    //累加時間
    
    self.sumTime += dTime;
    
    //累加距離
    
    self.sumDistance += distance;
    
    //計算平均速度
    
    CGFloat averangeSpeed = self.sumDistance/self.sumTime;
    
     CWLog(@"兩次之間的距離=%f 時間=%f 當前速度=%f 全程時間= %f  全程距離= %f 全程的平均速度 = %f",distance,dTime,speed,self.sumTime,self.sumDistance,averangeSpeed);

   }
   //記錄上一次的位置
   self.previousLocation = newlocation;

}

提示:

CLLocationDistance distance = [newlocation distanceFromLocation:self.previousLocation];很重要獲取兩個位置之間的距離
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,117評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,860評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,128評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,291評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,025評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,421評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,477評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,642評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,177評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,970評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,157評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,717評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,410評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,821評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,053評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,896評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,157評論 2 375

推薦閱讀更多精彩內容