For investors
股價(jià):
5.36 美元 %For investors
股價(jià):
5.36 美元 %認(rèn)真做教育 專心促就業(yè)
1.Getting the User’s Current Location
獲取用戶當(dāng)前位置。
獲取位置的方式有三種:GPS, cell tower triangulation(蜂窩站點(diǎn)), 和 Wi-Fi Positioning Service (WPS).其中GPS是最精確的定位方式,但是在第一代iphone上沒(méi)有。GPS是通過(guò)讀取很多衛(wèi)星微波信號(hào)來(lái)確定當(dāng)前位置的。蜂窩站點(diǎn)通過(guò) iphone周圍的站點(diǎn)計(jì)算出來(lái)的,在蜂窩站點(diǎn)密集的地方使用這種技術(shù)可以達(dá)到一個(gè)準(zhǔn)確的值,比如在城市但在蜂窩站點(diǎn)不密集的地方效果就沒(méi)那么好了。最后 一個(gè)WPS使用的是連接到Wi-Fi網(wǎng)絡(luò)的IP地址來(lái)確定位置,這將會(huì)有較大的誤差。這三種方式都會(huì)消耗大量的電。怎么才能即實(shí)現(xiàn)定位功能又省電呢?下面的方法就可以解決:當(dāng)使用Core Location時(shí),可以選擇精確度,謹(jǐn)慎的選擇你所需要的準(zhǔn)確度,可以幫助你省很多電。Core Location使用的技術(shù)隱藏在應(yīng)用程序中。我們無(wú)需選擇使用GPS、蜂窩站點(diǎn)技術(shù)還是WPS,我們只要告訴它我們需要的準(zhǔn)確度它會(huì)自己決定選什么技術(shù) 來(lái)滿足我們的需求。
2.The Location Manager
Core Location的接口是很容易使用的。主要用到的類是CLLocationManager,就是通常說(shuō)的Location Manager。為了使用Core Location我們需要?jiǎng)?chuàng)建Location Manager的實(shí)體:
CLLocationManager *locationManager = [[CLLocationManager alloc] init];
這 樣我們就創(chuàng)建了 Location Manager的實(shí)體,但是我們還沒(méi)有開始定位。我們需要指派一個(gè)代理給Location Manager。當(dāng)定位信息改變時(shí)Location Manager將調(diào)用代理方法。定位的過(guò)程會(huì)花一段時(shí)間平均幾秒鐘。代理方法必須遵循CLLocationManagerDelegate協(xié)議。
3.Setting the Desired Accuracy
設(shè)置代理后,你還要設(shè)置需要的準(zhǔn)確度。就像我們剛剛說(shuō)的精確度越高越耗電。如果你只是要是應(yīng)用程序確定是哪個(gè)國(guó)家或是哪個(gè)州那么就不要設(shè)置很高的精確度。記住一點(diǎn)有時(shí)候你并不能得到你需要的精確度。
下面說(shuō)一個(gè)設(shè)置代理和設(shè)置精確度的例子:
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
精確度使用的是一個(gè)double類型的常量。單位是米,所以如果你設(shè)置desiredAccuracy=10那么精確度就是10米,這就告訴 Location Manager盡可能達(dá)到10米的精確度。還可以設(shè)置為其他常量:
[cpp]
extern const CLLocationAccuracy kCLLocationAccuracyBestForNavigation ;
extern const CLLocationAccuracy kCLLocationAccuracyBest;
extern const CLLocationAccuracy kCLLocationAccuracyNearestTenMeters;
extern const CLLocationAccuracy kCLLocationAccuracyHundredMeters;
extern const CLLocationAccuracy kCLLocationAccuracyKilometer;
extern const CLLocationAccuracy kCLLocationAccuracyThreeKilometers;4.Setting the Distance Filter
4.Setting the Distance Filter
默認(rèn)情況是這樣的,每當(dāng)位置改變時(shí)Location Manager就調(diào)用一次代理。
通過(guò)設(shè)置distance filter可以實(shí)現(xiàn)當(dāng)位置改變超出一定范圍時(shí)Location Manager才調(diào)用相應(yīng)的代理方法。這樣可以達(dá)到省電的目的。
例如:locationManager.distanceFilter = 1000.0f;
如果設(shè)置默認(rèn)值:
locationManager.distanceFilter = kCLDistanceFilterNone;
5.Starting the Location Manager
開始定位
當(dāng)你轉(zhuǎn)備好為定位消耗電池時(shí)我們可以調(diào)用
[locationManager startUpdatingLocation];
來(lái)告訴 Location Manager開始定位
6.Using the Location Manager Wisely
如果你只需要確定當(dāng)前位置而不需要進(jìn)一步定位,當(dāng)Location Manager查詢到當(dāng)前位置時(shí)需要通知代理停止定位。
停止方法: [locationManager stopUpdatingLocation];
7.The Location Manager Delegate
Location Manager必須遵守CLLocationManagerDelegate協(xié)議,CLLocationManagerDelegate協(xié)議定義了兩個(gè)方 法,并且這兩個(gè)方法都是可選的。其中一個(gè)方法是當(dāng)確定當(dāng)前位置或是位置信息改變時(shí)調(diào)用。另一個(gè)方法是當(dāng)遇到錯(cuò)誤信息時(shí)調(diào)用
8.Getting Location Updates
當(dāng)Location Manager想通知它的代理當(dāng)前位置時(shí),它會(huì)調(diào)用
locationManager:didUpdateToLocation:fromLocation: 方法。
這個(gè)方法有3個(gè)參數(shù)第一個(gè)參數(shù)Location Manager。第二個(gè)參數(shù)是一個(gè)CLLocation對(duì)象用來(lái)確定當(dāng)前位置,第三個(gè)是CLLocation 對(duì)象用來(lái)確定最近一次更新的位置。該方法調(diào)用時(shí),先前的location對(duì)象會(huì)被置空。
9.Getting Latitude and Longitude Using CLLocation
經(jīng)緯度
位置信息是通過(guò)使用CLLocation類的實(shí)例從Location Manager那里得到的。這個(gè)類有5各屬性。latitude和longitude被封裝在coordinate屬性中。
獲取方式如下:
CLLocationDegrees latitude = theLocation.coordinate.latitude;
CLLocationDegrees longitude = theLocation.coordinate.longitude;
CLLocation對(duì)象還可以告訴你精確度。
horizontalAccuracy屬性描述調(diào)整的中心點(diǎn)。horizontalAccuracy值越大越不精確。
CLLocation 還有一個(gè)叫altitude的屬性用來(lái)表示海拔
CLLocationDistance altitude = theLocation.altitude;
每一個(gè)CLLocation對(duì)象都有一個(gè)叫verticalAccuracy的屬性來(lái)判斷精確度。海拔數(shù)值可能會(huì)有verticalAccuracy大小的誤差,當(dāng)verticalAccuracy為負(fù)值時(shí),那是Core Location在通知你不能獲取海拔高度。
CLLocation的另一個(gè)屬性timestamp用來(lái)告訴Location Manager是什么時(shí)候定位的。CLLocation還有一個(gè)實(shí)例方法來(lái)告訴你的兩個(gè)CLLocation對(duì)象之間的距離。這個(gè)方法叫:getDistanceFrom:
它是這樣工作的:
CLLocationDistance distance = [fromLocation getDistanceFrom:toLocation];
返回兩個(gè)時(shí)間段內(nèi)的距離,有時(shí)候它是不考慮海拔的,所以要自己計(jì)算距離。
10.Error Notifications
如果Core Location不能指定你當(dāng)前的位置,它將調(diào)用CLLocation的第二個(gè)代理方法:locationManager:didFailWithError:,最常見(jiàn)的是用戶取消使用定位信息。
【免責(zé)聲明】本文部分系轉(zhuǎn)載,轉(zhuǎn)載目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé)。如涉及作品內(nèi)容、版權(quán)和其它問(wèn)題,請(qǐng)?jiān)?0日內(nèi)與聯(lián)系我們,我們會(huì)予以更改或刪除相關(guān)文章,以保證您的權(quán)益!