【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】iOS6定位服務(wù)編程詳解_第1頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】iOS6定位服務(wù)編程詳解_第2頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】iOS6定位服務(wù)編程詳解_第3頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】iOS6定位服務(wù)編程詳解_第4頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】iOS6定位服務(wù)編程詳解_第5頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余1頁(yè)可下載查看

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】iOS6定位服務(wù)編程詳解

現(xiàn)在的移動(dòng)設(shè)備很多都提供定位服務(wù),使用iOS系統(tǒng)的iPhone、iPodTouch和iPad都可以提供位置服務(wù),iOS設(shè)備能提供3種不同途徑進(jìn)行定位:Wifi,蜂窩式移動(dòng)電話(huà)基站,GPS衛(wèi)星iOS不像Android系統(tǒng)在定位服務(wù)編程時(shí),可以指定采用哪種途徑進(jìn)行定位。iOS的API把底層這些細(xì)節(jié)屏蔽掉了,開(kāi)發(fā)人員和用戶(hù)并不知道現(xiàn)在設(shè)備是采用哪種方式進(jìn)行定位的,iOS系統(tǒng)會(huì)根據(jù)設(shè)備的情況和周?chē)沫h(huán)境,采用一套最佳的解決方案。這個(gè)方案是這樣的,如果能夠接收GPS信息,那么設(shè)備優(yōu)先采用GPS定位,否則采用Wifi或蜂窩基站定位,在Wifi和蜂窩基站之間優(yōu)先使用Wifi,如果無(wú)法連接Wifi才使用蜂窩基站定位??傮w來(lái)說(shuō)GPS定位優(yōu)點(diǎn)是準(zhǔn)確、覆蓋面廣闊,缺點(diǎn)是不能被遮擋(例如:在建筑物里面收不到GPS衛(wèi)星信號(hào))、GPS開(kāi)啟后比較費(fèi)電。蜂窩基站不僅誤差比較大,而且會(huì)耗費(fèi)用戶(hù)流量費(fèi)。而Wifi定位是最經(jīng)濟(jì)實(shí)惠的。定位服務(wù)編程定位服務(wù)在iOS6之后API沒(méi)有太大的變化,主要使用CoreLocation框架,定位時(shí)候主要使用CLLocationManager、CLLocationManagerDelegate和CLLocation。CLLocationManager是定位服務(wù)管理類(lèi)它能夠給我們提供獲得設(shè)備的位置信息和高度信息,也可以監(jiān)控設(shè)備進(jìn)入或離開(kāi)某個(gè)區(qū)域,它還可以幫助獲得設(shè)備的運(yùn)行方向等。CLLocationManagerDelegate是CLLocationManager類(lèi)委托協(xié)議。CLLocation類(lèi)是封裝了位置和高度信息。在定位服務(wù)的應(yīng)用中,第一次請(qǐng)求獲得位置信息時(shí)候,系統(tǒng)會(huì)提示用戶(hù)是否允許開(kāi)啟定位服務(wù)。用戶(hù)所在的位置是比較私密的信息,應(yīng)用獲取這些信息用戶(hù)是有知情權(quán)和否定權(quán)的。如果應(yīng)用在用戶(hù)不知情的情況下,而獲得用戶(hù)的位置信息,這在某些國(guó)家是違法的行為。選擇“不允許”,定位服務(wù)就無(wú)法獲得位置信息了,如果想改變這些設(shè)置可以在系統(tǒng)設(shè)置應(yīng)用中開(kāi)啟或關(guān)閉。我們可以關(guān)閉所有的定位服務(wù),只需要把最上面的“定位服務(wù)”開(kāi)關(guān)控件關(guān)閉就可以了。下面的具體應(yīng)用也可以關(guān)閉和開(kāi)啟。下面我們通過(guò)一個(gè)案例介紹一下使用定位服務(wù)編程,在應(yīng)用啟動(dòng)時(shí)候啟動(dòng),進(jìn)入畫(huà)面時(shí)候會(huì)獲得位置信息,并顯示在對(duì)應(yīng)的文本框中,如果設(shè)備位置發(fā)送變化,也會(huì)重新會(huì)的位置信息,并更新對(duì)應(yīng)的文本框。首先要實(shí)現(xiàn)定位服務(wù)的案例,需要為工程引入CoreLocation框架,添加具體步驟是選擇工程中的TARGETS→WhereAmI→BuildPhases→LinkBinaryWithLibraries,選擇右下角的“+”按鈕,打開(kāi)框架和庫(kù)選擇對(duì)話(huà)框再添加對(duì)話(huà)框中選擇CoreLocation.framework,點(diǎn)擊Add按鈕后添加完成。UI設(shè)計(jì)部分我們不再介紹。我們直接看看實(shí)現(xiàn)代碼,其中主要代碼是視圖控制器ViewController中編寫(xiě)的,其中ViewController.h代碼如下:#import<UIKit/UIKit.h>

#import<CoreLocation/CoreLocation.h>

#import<CoreLocation/CLLocationManagerDelegate.h>

@interfaceViewController:UIViewController<CLLocationManagerDelegate>

//經(jīng)度

@property(weak,nonatomic)IBOutletUITextField*txtLng;

//緯度

@property(weak,nonatomic)IBOutletUITextField*txtLat;

//高度

@property(weak,nonatomic)IBOutletUITextField*txtAlt;

@property(nonatomic,strong)CLLocationManager*locationManager;

@end在h文件中首先需要引入<CoreLocation/CoreLocation.h>和<CoreLocation/CLLocationManagerDelegate.h>頭文件。然后在定義ViewController時(shí)需要聲明實(shí)現(xiàn)CLLocationManagerDelegate協(xié)議。我們還定義了CLLocationManager*locationManager屬性。ViewController.m的viewDidLoad代碼如下:-(void)viewDidLoad

{

[superviewDidLoad];

//定位服務(wù)管理對(duì)象初始化

_locationManager=[[CLLocationManageralloc]init];

_locationManager.delegate=self;

_locationManager.desiredAccuracy=kCLLocationAccuracyBest;①

_locationManager.distanceFilter=1000.0f;②

}在viewDidLoad方法中,主要對(duì)CLLocationManager的成員變量_locationManager進(jìn)行初始化。首先使用[[CLLocationManageralloc]init]語(yǔ)句實(shí)例化CLLocationManager對(duì)象。然后_locationManager.delegate=self語(yǔ)句設(shè)置定位服務(wù)委托為self。第①行代碼設(shè)置desiredAccuracy屬性,它是一個(gè)非常重要的屬性,它的取值有6個(gè)常量:kCLLocationAccuracyNearestTenMeters。精度10米;kCLLocationAccuracyHundredMeters。精度100米;kCLLocationAccuracyKilometer。精度1000米;kCLLocationAccuracyThreeKilometers。精度3000米;kCLLocationAccuracyBest。設(shè)備使用電池供電時(shí)候,最高的精度;kCLLocationAccuracyBestForNavigation。導(dǎo)航情況下最高精度,一般要有外接電源時(shí)才能使用;精度越高請(qǐng)求獲得位置信息的時(shí)間就越短,這就意味著設(shè)備越耗電。因此一個(gè)應(yīng)用應(yīng)該選擇適合它的精度,如果你的應(yīng)用是一個(gè)車(chē)載導(dǎo)航應(yīng)用,kCLLocationAccuracyBestForNavigation是比較好的選擇,你可以使用汽車(chē)上的電瓶為設(shè)備供電。如果你的應(yīng)用為徒步旅行者提供的導(dǎo)航應(yīng)用,kCLLocationAccuracyHundredMeters是一個(gè)不錯(cuò)的選擇。第②行代碼設(shè)置distanceFilter屬性,它是距離過(guò)濾器,它定義了設(shè)備移動(dòng)更新位置信息的最小距離,它的單位是米,本例設(shè)置了1000米。初始化CLLocationManager完成之后,需要使用startUpdatingLocation方法開(kāi)始定位服務(wù)。它是在ViewController.m的viewWillAppear:方法中,代碼如下:-(void)viewWillAppear:(BOOL)animated

{

[superviewWillAppear:animated];

//開(kāi)始定位

[_locationManagerstartUpdatingLocation];

}調(diào)用startUpdatingLocation方法定位服務(wù)就會(huì)開(kāi)啟,它根據(jù)設(shè)定的條件,不斷請(qǐng)求回調(diào)新的位置信息。因此開(kāi)啟這個(gè)方法一定要慎重,要在最合適的時(shí)候開(kāi)啟,在視圖控制器的聲明周期方法中viewWillAppear:是最合適的。與開(kāi)啟服務(wù)對(duì)應(yīng)的方法是stopUpdatingLocation方法,它的調(diào)用是在視圖控制器的viewWillDisappear:方法中調(diào)用的,代碼如下:-(void)viewWillDisappear:(BOOL)animated

{

[superviewWillDisappear:animated];

//停止定位

[_locationManagerstopUpdatingLocation];

}viewWillDisappear:在視圖消失(應(yīng)用退到后臺(tái))時(shí)調(diào)用,能夠保證最及時(shí)地關(guān)閉定位服務(wù),這是負(fù)責(zé)任的做法。在iOS6之后請(qǐng)求有所變化,定位服務(wù)應(yīng)用退入臺(tái)后可以延遲更新位置信息,其中allowDeferredLocationUpdatesUntilTraveled:timeout:方法可以設(shè)置延遲更新,從而使得應(yīng)用在后臺(tái)不再更新位置信息。關(guān)閉延遲更新使用disallowDeferredLocationUpdates方法實(shí)現(xiàn)。此外,在iOS6之后新增pausesLocationUpdatesAutomatically屬性,它能設(shè)定自動(dòng)暫停位置更新,定位服務(wù)的開(kāi)啟和暫停管理權(quán)交給系統(tǒng),這樣會(huì)更加合理和簡(jiǎn)單。一旦定位服務(wù)開(kāi)啟,并設(shè)置好了CLLocationManager委托屬性delegate后,當(dāng)用戶(hù)設(shè)備移動(dòng)到達(dá)過(guò)濾距離時(shí),就會(huì)回調(diào)委托方法,與定位服務(wù)有關(guān)的方法有兩個(gè):locationManager:didUpdateLocations:定位成功,是iOS6新方法,替代之前的locationManager:didUpdateToLocation:fromLocation:方法;locationManager:didFailWithError:定位失敗;實(shí)現(xiàn)CLLocationManager委托代碼如下:#pragmamarkCoreLocation委托方法用于實(shí)現(xiàn)位置的更新-(void)locationManager:(CLLocationManager*)managerdidUpdateLocations:(NSArray*)locations

{

CLLocation*currLocation=[locationslastObject];①

_txtLat.text=[NSStringstringWithFormat:@"%3.5f",

currLocation.coordinate.latitude];②

_txtLng.text=[NSStringstringWithFormat:@"%3.5f",

currLocation.coordinate.longitude];③

_txtAlt.text=[NSStringstringWithFormat:@"%3.5f",

currLocation.altitude];④

}

-(void)locationManager:(CLLocationManager*)managerdidFailWithError:(NSError*)error

{

NSLog(@”error:%@”,error);

}在locationManager:didUpdateLocations:方法中參數(shù)locations是位置變化的集合,它按照時(shí)間變化的順序存放。如果想獲得當(dāng)前設(shè)備的位置,可以使用第①行的[locationslastObject]語(yǔ)句獲得集合中最后一個(gè)元素,它就是設(shè)備當(dāng)前位置了。從集合中返回的對(duì)象類(lèi)型是CLLocation,CLLocation封裝了位置、高度等信息。在上面代碼中我們使用了它的兩個(gè)屬性:altitude和coordinate,altitude屬性是高度值,coordinate是封裝了經(jīng)度和緯度的結(jié)構(gòu)體CLLocationCoordinate2D,CLLocationCoordinate2D定義如下:typedefstruct{

CLLocationDegreeslatitude;//緯度

CLLocationDegreeslongitude;//經(jīng)度

}

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論