偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

iOS 定位服務(wù)編程詳解

移動(dòng)開發(fā) iOS
iOS 不像Android系統(tǒng)在定位服務(wù)編程時(shí),可以指定采用哪種途徑進(jìn)行定位。iOS的API把底層這些細(xì)節(jié)屏蔽掉了,開發(fā)人員和用戶并不知道現(xiàn)在設(shè)備是采用 哪種方式進(jìn)行定位的,iOS系統(tǒng)會(huì)根據(jù)設(shè)備的情況和周圍的環(huán)境,采用一套最佳的解決方案。

現(xiàn)在的移動(dòng)設(shè)備很多都提供定位服務(wù),使用iOS系統(tǒng)的iPhone、iPod Touch和iPad都可以提供位置服務(wù),iOS設(shè)備能提供3種不同途徑進(jìn)行定位:Wifi, 蜂窩式移動(dòng)電話基站, GPS衛(wèi)星

iOS 不像Android系統(tǒng)在定位服務(wù)編程時(shí),可以指定采用哪種途徑進(jìn)行定位。iOS的API把底層這些細(xì)節(jié)屏蔽掉了,開發(fā)人員和用戶并不知道現(xiàn)在設(shè)備是采用 哪種方式進(jìn)行定位的,iOS系統(tǒng)會(huì)根據(jù)設(shè)備的情況和周圍的環(huán)境,采用一套最佳的解決方案。這個(gè)方案是這樣的,如果能夠接收GPS信息,那么設(shè)備優(yōu)先采用 GPS定位,否則采用Wifi或蜂窩基站定位,在Wifi和蜂窩基站之間優(yōu)先使用Wifi,如果無法連接Wifi才使用蜂窩基站定位。

總體來說GPS定位優(yōu)點(diǎn)是準(zhǔn)確、覆蓋面廣闊,缺點(diǎn)是不能被遮擋(例如:在建筑物里面收不到GPS衛(wèi)星信號(hào))、GPS開啟后比較費(fèi)電。蜂窩基站不僅誤差比較大,而且會(huì)耗費(fèi)用戶流量費(fèi)。而Wifi定位是最經(jīng)濟(jì)實(shí)惠的。

定位服務(wù)編程

定 位服務(wù)在iOS 6之后API沒有太大的變化,主要使用CoreLocation框架,定位時(shí)候主要使用CLLocationManager、 CLLocationManagerDelegate和CLLocation。CLLocationManager是定位服務(wù)管理類它能夠給我們提供獲得 設(shè)備的位置信息和高度信息,也可以監(jiān)控設(shè)備進(jìn)入或離開某個(gè)區(qū)域,它還可以幫助獲得設(shè)備的運(yùn)行方向等。CLLocationManagerDelegate 是CLLocationManager類委托協(xié)議。CLLocation類是封裝了位置和高度信息。

在定位服務(wù)的應(yīng)用中,第一次請(qǐng)求獲得位置信息時(shí)候,系統(tǒng)會(huì)提示用戶是否允許開啟定位服務(wù)。用戶所在的位置是比較私密的信息,應(yīng)用獲取這些信息用戶是有知情權(quán)和否定權(quán)的。如果應(yīng)用在用戶不知情的情況下,而獲得用戶的位置信息,這在某些國家是違法的行為。

1

選擇“不允許”,定位服務(wù)就無法獲得位置信息了,如果想改變這些設(shè)置可以在系統(tǒng)設(shè)置應(yīng)用中開啟或關(guān)閉。

2

我們可以關(guān)閉所有的定位服務(wù),只需要把最上面的“定位服務(wù)”開關(guān)控件關(guān)閉就可以了。下面的具體應(yīng)用也可以關(guān)閉和開啟。

下面我們通過一個(gè)案例介紹一下使用定位服務(wù)編程,在應(yīng)用啟動(dòng)時(shí)候啟動(dòng),進(jìn)入畫面時(shí)候會(huì)獲得位置信息,并顯示在對(duì)應(yīng)的文本框中,如果設(shè)備位置發(fā)送變化,也會(huì)重新會(huì)的位置信息,并更新對(duì)應(yīng)的文本框。

3

首先要實(shí)現(xiàn)定位服務(wù)的案例,需要為工程引入CoreLocation框架,添加具體步驟是選擇工程中的TARGETS→WhereAmI→Build Phases→Link Binary With Libraries,選擇右下角的“+”按鈕,打開框架和庫選擇對(duì)話框

4

再添加對(duì)話框中選擇CoreLocation.framework,點(diǎn)擊Add按鈕后添加完成。UI設(shè)計(jì)部分我們不再介紹。我們直接看看實(shí)現(xiàn)代碼,其中主要代碼是視圖控制器ViewController中編寫的,其中ViewController.h代碼如下:

  1. #import <UIKit/UIKit.h>   
  2.    
  3. #import <CoreLocation/CoreLocation.h>   
  4.    
  5. #import <CoreLocation/CLLocationManagerDelegate.h>   
  6.    
  7. @interface ViewController : UIViewController <CLLocationManagerDelegate>   
  8.    
  9. //經(jīng)度   
  10.    
  11. @property (weak, nonatomic) IBOutlet UITextField *txtLng;   
  12.    
  13. //緯度   
  14.    
  15. @property (weak, nonatomic) IBOutlet UITextField *txtLat;   
  16.    
  17. //高度   
  18.    
  19. @property (weak, nonatomic) IBOutlet UITextField *txtAlt;   
  20.    
  21. @property(nonatomic, strong) CLLocationManager *locationManager;   
  22.    
  23. @end   

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

ViewController.m的viewDidLoad代碼如下:

  1. - (void)viewDidLoad   
  2.    
  3. {   
  4.    
  5. [super viewDidLoad];   
  6.    
  7. //定位服務(wù)管理對(duì)象初始化   
  8.    
  9. _locationManager = [[CLLocationManager alloc] init];   
  10.    
  11. _locationManager.delegate = self;   
  12.    
  13. _locationManager.desiredAccuracy = kCLLocationAccuracyBest; ①   
  14.    
  15. _locationManager.distanceFilter = 1000.0f;  ②   
  16.    
  17. }   

在viewDidLoad方法中,主要對(duì)CLLocationManager的成員變量 _locationManager進(jìn)行初始化。首先使用[[CLLocationManager alloc] init]語句實(shí)例化 CLLocationManager對(duì)象。然后_locationManager.delegate = self語句設(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è)車載導(dǎo)航應(yīng) 用,kCLLocationAccuracyBestForNavigation是比較好的選擇,你可以使用汽車上的電瓶為設(shè)備供電。如果你的應(yīng)用為徒步 旅行者提供的導(dǎo)航應(yīng)用,kCLLocationAccuracyHundredMeters是一個(gè)不錯(cuò)的選擇。

第②行代碼設(shè)置distanceFilter屬性,它是距離過濾器,它定義了設(shè)備移動(dòng)更新位置信息的最小距離,它的單位是米,本例設(shè)置了1000米。

初始化CLLocationManager完成之后,需要使用startUpdatingLocation方法開始定位服務(wù)。它是在ViewController.m的viewWillAppear:方法中,代碼如下:

  1. - (void)viewWillAppear:(BOOL)animated   
  2.        
  3.     {   
  4.        
  5.     [super viewWillAppear:animated];   
  6.        
  7.     //開始定位   
  8.        
  9.     [_locationManager startUpdatingLocation];   
  10.        
  11.     }   

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

  1. - (void)viewWillDisappear:(BOOL)animated   
  2.        
  3.     {   
  4.        
  5.     [super viewWillDisappear:animated];   
  6.        
  7.     //停止定位   
  8.        
  9.     [_locationManager stopUpdatingLocation];   
  10.        
  11.     }   

viewWillDisappear:在視圖消失(應(yīng)用退到后臺(tái))時(shí)調(diào)用,能夠保證最及時(shí)地關(guān)閉定位服務(wù),這是負(fù)責(zé) 任的做法。在iOS 6之后請(qǐng)求有所變化,定位服務(wù)應(yīng)用退入臺(tái)后可以延遲更新位置信息,其中 allowDeferredLocationUpdatesUntilTraveled:timeout:方法可以設(shè)置延遲更新,從而使得應(yīng)用在后臺(tái)不再 更新位置信息。關(guān)閉延遲更新使用disallowDeferredLocationUpdates方法實(shí)現(xiàn)。此外,在iOS 6之后新增 pausesLocationUpdatesAutomatically屬性,它能設(shè)定自動(dòng)暫停位置更新,定位服務(wù)的開啟和暫停管理權(quán)交給系統(tǒng),這樣會(huì)更 加合理和簡單。

一旦定位服務(wù)開啟,并設(shè)置好了CLLocationManager委托屬性delegate后,當(dāng)用戶設(shè)備移動(dòng)到達(dá)過濾距離時(shí),就會(huì)回調(diào)委托方法,與定位服務(wù)有關(guān)的方法有兩個(gè):

locationManager:didUpdateLocations: 定位成功,是iOS 6新方法,替代之前的locationManager:didUpdateToLocation:fromLocation:方法;

locationManager:didFailWithError: 定位失??;

實(shí)現(xiàn)CLLocationManager委托代碼如下:

  1. #pragma mark Core Location委托方法用于實(shí)現(xiàn)位置的更新   
  2.  
  3. - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations   
  4.        
  5.     {   
  6.        
  7.     CLLocation * currLocation = [locations lastObject]; ①   
  8.        
  9.     _txtLat.text = [NSString stringWithFormat:@"%3.5f",   
  10.        
  11.     currLocation.coordinate.latitude];  ②   
  12.        
  13.     _txtLng.text = [NSString stringWithFormat:@"%3.5f",   
  14.        
  15.     currLocation.coordinate.longitude];  ③   
  16.        
  17.     _txtAlt.text = [NSString stringWithFormat:@"%3.5f",   
  18.        
  19.     currLocation.altitude];  ④   
  20.        
  21.     }   
  22.  
  23. - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error   
  24.        
  25.     {   
  26.        
  27.     NSLog(@”error: %@”,error);   
  28.        
  29.     }   

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

  1. typedef struct {   
  2.        
  3.     CLLocationDegrees latitude; //緯度   
  4.        
  5.     CLLocationDegrees longitude; //經(jīng)度   
  6.        
  7.     } CLLocationCoordinate2D;   

其中l(wèi)atitude為經(jīng)度信息,longitude為緯度信息,它們都是CLLocationDegrees類型,CLLocationDegrees是使用typedef定義的double類型。

第 ②行代碼中的newLocation.coordinate.latitude表達(dá)式是獲得設(shè)備當(dāng)前的緯度,第③行代碼中的 newLocation.coordinate.longitude表達(dá)式是獲得設(shè)備當(dāng)前的緯度,而獲得高度可以使用第④行 newLocation.altitude表達(dá)式直接獲得。

責(zé)任編輯:閆佳明 來源: cnblogs
相關(guān)推薦

2014-07-24 09:11:34

2010-08-25 15:56:10

CSSPositioning定位

2011-08-22 11:07:16

IOS 開發(fā)多核內(nèi)存

2010-09-06 13:15:48

CSS定位

2010-09-10 12:40:06

CSS相對(duì)定位CSS絕對(duì)定位

2010-09-08 16:22:32

PositionCSS

2010-08-26 16:40:35

DIV定位

2010-09-14 16:20:19

DIV定位

2016-09-07 20:43:36

Javascript異步編程

2011-05-27 15:56:30

Android

2023-07-07 10:37:43

自動(dòng)駕駛技術(shù)

2011-12-12 11:16:02

iOS并發(fā)編程

2014-11-04 10:38:13

iOS圖形

2017-08-28 16:32:16

iOS編程規(guī)范代碼注釋

2009-04-15 09:05:31

2015-07-27 09:53:13

PHP編程過程

2021-06-06 16:56:49

異步編程Completable

2011-06-24 15:30:22

QT 皮膚 QSS

2011-07-08 18:03:30

Cocoa Touch 網(wǎng)絡(luò)

2013-04-01 13:19:43

iOS定位與坐標(biāo)算法
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)