每個CLLocation對象都有一個叫verticalAccuracy的屬性來判斷精確度。海拔數值可能會有verticalAccuracy大小的偏差,當verticalAccuracy爲負值時,那是Core Location在通知你不能獲取海拔高度。 git
1.Getting theUser’s Current Location網絡
獲取用戶當前位置。iphone
獲取位置的方式有三種:GPS, cell towertriangulation(蜂窩站點), 和 Wi-FiPositioning Service (WPS).其中GPS是最精確的定位方式,可是在第一代iphone上沒有。GPS是經過讀取不少衛星微波信號來肯定當前位置的。蜂窩站點經過 iphone周圍的站點計算出來的,在蜂窩站點密集的地方使用這種技術能夠達到一個準確的值,好比在城市但在蜂窩站點不密集的地方效果就沒那麼好了。最後一個WPS使用的是鏈接到Wi-Fi網絡的IP地址來肯定位置,這將會有較大的偏差。這三種方式都會消耗大量的電。怎麼才能即實現定位功能又省電呢?下面的方法就能夠解決:當使用Core Location時,能夠選擇精確度,謹慎的選擇你所須要的準確度,能夠幫助你省不少電。Core Location使用的技術隱藏在應用程序中。咱們無需選擇使用GPS、蜂窩站點技術仍是WPS,咱們只要告訴它咱們須要的準確度它會本身決定選什麼技術 來知足咱們的需求。代理
2.The Location Managerrest
Core Location的接口是很容易使用的。主要用到的類是CLLocationManager,就是一般說的Location Manager。爲了使用Core Location咱們須要建立Location Manager的實體:對象
CLLocationManager *locationManager =[[CLLocationManager alloc] init];接口
這樣咱們就建立了 Location Manager的實體,可是咱們尚未開始定位。咱們須要指派一個代理給Location Manager。當定位信息改變時Location Manager將調用代理方法。定位的過程會花一段時間平均幾秒鐘。代理方法必須遵循CLLocationManagerDelegate協議。ip
3.Setting the Desired Accuracyget
設置代理後,你還要設置須要的準確度。就像咱們剛剛說的精確度越高越耗電。若是你只是要是應用程序肯定是哪一個國家或是哪一個州那麼就不要設置很高的精確度。記住一點有時候你並不能獲得你須要的精確度。it
下面說一個設置代理和設置精確度的例子:
locationManager.delegate = self;
locationManager.desiredAccuracy =kCLLocationAccuracyBest;
精確度使用的是一個double類型的常量。單位是米,因此若是你設置desiredAccuracy=10那麼精確度就是10米,這就告訴 Location Manager儘量達到10米的精確度。還能夠設置爲其餘常量:
[cpp]
extern const CLLocationAccuracykCLLocationAccuracyBestForNavigation ;
extern const CLLocationAccuracykCLLocationAccuracyBest;
extern const CLLocationAccuracykCLLocationAccuracyNearestTenMeters;
extern const CLLocationAccuracykCLLocationAccuracyHundredMeters;
extern const CLLocationAccuracykCLLocationAccuracyKilometer;
extern const CLLocationAccuracykCLLocationAccuracyThreeKilometers;4.Setting the Distance Filter
4.Setting the Distance Filter
默認狀況是這樣的,每當位置改變時Location Manager就調用一次代理。
經過設置distance filter能夠實現當位置改變超出必定範圍時Location Manager才調用相應的代理方法。這樣能夠達到省電的目的。
例如:locationManager.distanceFilter =1000.0f;
若是設置默認值:
locationManager.distanceFilter =kCLDistanceFilterNone;
5.Starting the Location Manager
開始定位
當你轉備好爲定位消耗電池時咱們能夠調用
[locationManagerstartUpdatingLocation];
來告訴 Location Manager開始定位
6.Using the Location Manager Wisely
若是你只須要肯定當前位置而不須要進一步定位,當LocationManager查詢到當前位置時須要通知代理中止定位。
中止方法: [locationManagerstopUpdatingLocation];
7.The Location Manager Delegate
Location Manager必須遵照CLLocationManagerDelegate協議,CLLocationManagerDelegate協議定義了兩個方法,而且這兩個方法都是可選的。其中一個方法是當肯定當前位置或是位置信息改變時調用。另外一個方法是當遇到錯誤信息時調用
8.Getting Location Updates
當Location Manager想通知它的代理當前位置時,它會調用
locationManager:didUpdateToLocation:fromLocation:方法。
這個方法有3個參數第一個參數LocationManager。第二個參數是一個CLLocation對象用來肯定當前位置,第三個是CLLocation 對象用來肯定最近一次更新的位置。該方法調用時,先前的location對象會被置空。
9.Getting Latitude and Longitude UsingCLLocation
經緯度
位置信息是經過使用CLLocation類的實例從Location Manager那裏獲得的。這個類有5各屬性。latitude和longitude被封裝在coordinate屬性中。
獲取方式以下:
CLLocationDegrees latitude =theLocation.coordinate.latitude;
CLLocationDegrees longitude =theLocation.coordinate.longitude;
CLLocation對象還能夠告訴你精確度。
horizontalAccuracy屬性描述調整的中心點。horizontalAccuracy值越大越不精確。
CLLocation 還有一個叫altitude的屬性用來表示海拔
CLLocationDistance altitude =theLocation.altitude;
每個CLLocation對象都有一個叫verticalAccuracy的屬性來判斷精確度。海拔數值可能會有verticalAccuracy大小的偏差,當verticalAccuracy爲負值時,那是Core Location在通知你不能獲取海拔高度。
CLLocation的另外一個屬性timestamp用來告訴Location Manager是何時定位的。CLLocation還有一個實例方法來告訴你的兩個CLLocation對象之間的距離。這個方法叫:getDistanceFrom:
它是這樣工做的:
CLLocationDistance distance =[fromLocation getDistanceFrom:toLocation];
返回兩個時間段內的距離,有時候它是不考慮海拔的,因此要本身計算距離。
10.Error Notifications
若是Core Location不能指定你當前的位置,它將調用CLLocation的第二個代理方法:locationManager:didFailWithError:,最多見的是用戶取消使用定位信息。