CoreLocation(地理定位)的基本使用

一、CoreLocation框架使用前提

  1. 導入主頭文件
    #import <CoreLocation/CoreLocation.h>
    注意:CoreLocation框架中所有數據類型的前綴都是CL;CoreLocation中使用CLLocationManager對象來做用戶定位。

二、CoreLocation框架使用流程

  1. 創建CoreLocation管理者

     CLLocationManager *manager = [[CLLocationManager alloc] init];
    

注意:創建CoreLocation管理者要變成屬性,使用強引用,因為viewDidLoad方法執行完畢,CLLocationManager是個局部變量,會被銷毀。

  1. 成為CoreLocationManager的代理,監聽獲取到的位置

     manager.delegate = self;
    
  2. 主動要求用戶對應用程序授權
    在iOS8以前,只有開始定位,系統就會自動要求用戶對你的應用程序授權。從iOS8開始,想要定位,必須先主動要求用戶授權,而且必須在info.plist文件中配置一項屬性才能彈出允許授權的窗口。

  • requestWhenInUseAuthorization:請求前臺的定位權限
  • requestAlwaysAuthorization:請求前臺和后臺的定位權限cc
  • NSLocationWhenInUseDescription:允許在前臺獲取GPS的描述
  • NSLocationAlwaysUsageDescription:允許在后臺獲取GPS的描述

開發者可以在Info.plist中設置NSLocationUsageDescription說明定位的目的(Privacy -
Location Usage Description)。一旦用戶選擇了“Don’tAllow”,意味著你的應用無法使用定位功能,為了嚴謹起見,最好在使用定位功能之前判斷當前應用的定位功能是否可用。CLLocationManager有個類方法可以判斷當前應用的定位功能是否可用:

    + (BOOL)locationServicesEnabled;
  1. 開始監聽(開始獲取位置)
    調用[self.manager startUpdatingLocation],當調用了startUpdatingLocation方法,就開始不斷地定位用戶的位置,中途會頻繁地調用下面的代理方法:- (void)locationManager:(CLLocationManager)manager didUpdateLocations:(NSArray)locations;

  2. 實現CLLocationManager的代理方法
    (1)當授權狀態發生改變時調用:

- (void)locationManager:(CLLocationManager*)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
if(status ==kCLAuthorizationStatusNotDetermined) {
NSLog(@"等待用戶授權");
}else if(status ==kCLAuthorizationStatusAuthorizedAlways||
status ==kCLAuthorizationStatusAuthorizedWhenInUse)
{
NSLog(@"授權成功");
//開始定位
[self.mgr startUpdatingLocation];
}else
{
NSLog(@"授權失敗");
}
}

CLAuthorizationStatus枚舉類型:

  • 用戶從未選擇過權限:kCLAuthorizationStatusNotDetermined
  • 無法使用定位服務,該狀態用戶無法改變:kCLAuthorizationStatusRestricted
  • 用戶拒絕該應用使用定位服務,或是定位服務總開關處于關閉狀態:kCLAuthorizationStatusDenied
  • 已經授權(廢棄):kCLAuthorizationStatusAuthorized
  • 用戶允許該程序無論何時都可以使用地理信息:kCLAuthorizationStatusAuthorizedAlways
  • 用戶同意程序在可見時使用地理位置:kCLAuthorizationStatusAuthorizedWhenInUse

(2)當獲取到位置信息之后會調用:

- (void)locationManager:(CLLocationManager*)manager didUpdateLocations:(NSArray*)locations {
  //如果只需要獲取一次,可以獲取到位置之后就停止
  [self.mgr stopUpdatingLocation];
}

在該代理方法中,還可以獲取以下信息:

  • location.coordinate:坐標,包含經緯度
  • location.altitude:設備海拔高度單位是米
  • location.course:設置前進方向
  • location.horizontalAccuracy:水平精準度
  • location.verticalAccuracy:垂直精準度
  • location.timestamp:定位信息返回的時間
  • location.speed:設備移動速度單位是米/秒,適用于行車速度而不太適用于不行

6.報錯處理
使用CoreLocation獲取地理位置信息,報錯:
Error Domain=kCLErrorDomain Code=0 "The operation couldn’t be completed. (kCLErrorDomain error 0.)"
解決方法:

  • 確定模擬器或者手機已經聯網并且允許應用程序獲取地理位置
  • 重置地理位置服務或者網絡服務
    ps:如果是模擬器就果斷直接重置模擬器吧 IOS Simulator - Reset Content and Settings...
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 簡介 在移動互聯網時代,移動app能解決用戶的很多生活瑣事,比如 周邊:找餐館、找KTV、找電影院等等 導航:根據...
    JonesCxy閱讀 1,233評論 1 1
  • CoreLocation框架 一. iOS8.0之前的定位(?????) 前臺定位導入CoreLocation框架...
    尼古拉斯趙四爺閱讀 996評論 0 2
  • 出自http://my.oschina.net/are1OfBlog/blog/420034 摘要 現在很多社交、...
    JJO閱讀 4,165評論 4 19
  • CoreLocation框架 一. iOS8.0之前的定位(?????) 1. 前臺定位 導入CoreLocati...
    0271fb6f797c閱讀 541評論 0 1
  • 忙碌的一天終于結束了 累的癱在寢室,今天特種兵可以休息一下啦,不用簽到,還是有些不習慣了 下周估計面臨的挑戰更大,...
    珍珍_03b1閱讀 187評論 0 0