天天看點

iOS8.0 定位

在IOS8中定位功能廢除了一個方法:

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_6, __MAC_NA, __IPHONE_2_0, __IPHONE_6_0);      

新增了兩個方法:

- (void)requestWhenInUseAuthorization __OSX_AVAILABLE_STARTING(__MAC_NA, __IPHONE_8_0);      
- (void)requestAlwaysAuthorization __OSX_AVAILABLE_STARTING(__MAC_NA, __IPHONE_8_0);      

這兩個新增的方法導緻,之前寫的程式在iOS8運作會出現,定位功能無法正常使用

這樣讓iOS8正常使用定位功能呢?

1.  你需要在info.plist表裡面添加兩條變量

在Info.plist中加入兩個預設沒有的字段

  • NSLocationAlwaysUsageDescription
  • NSLocationWhenInUseUsageDescription

這兩個字段沒什麼特别的意思,就是自定義提示使用者授權使用地理定位功能時的提示語。

iOS8.0 定位

2. 導入庫檔案 CoreLocation.framework

iOS8.0 定位

3. 導入庫标題   <CoreLocation/CoreLocation.h>, 遵循協定   CLLocationManagerDelegate

  1. MainViewController.h
  2. #import<UIKit/UIKit.h>

      #import<CoreLocation/CoreLocation.h>

  3. @interface MainViewController:UIViewController<CLLocationManagerDelegate>

    @property (strong, nonatomic) CLLocationManager *locationManager;

  4. @end 
  1. MainViewController.m
  2. - (void) viewDidLoad {
  3. [super viewDidLoad];
  4. self.locationManager = [[CLLocationManager alloc]
  5. init]; 
  6. _locationManager.delegate = self;
  7. [_locationManager requestAlwaysAuthorization];
  8. _locationManager.desiredAccuracy = kCLLocationAccuracy
  9. Best; ①
  10. _locationManager.distanceFilter = 1000.0f; ②
  11. [_locationManger startUpdatingLocation];
  12. }

第① 行代碼設定desiredAccuracy屬性,它是一個非常重要的屬性,它的取值有6個常 量:kCLLocationAccuracyNearestTenMeters。精度10 米;kCLLocationAccuracyHundredMeters 。精度100 米;

kCLLocationAccuracyKilometer 。精度1000 米;

kCLLocationAccuracyThreeKilometers。精度3000米;

kCLLocationAccuracyBest 。裝置 使用電池供電時候,最高的精度;kCLLocationAccuracyBestForNavigation。導航情況下最高精度,一般要有外接電源時才能使用;

精度越高請求獲得位置資訊的時間就越短,這就意味着裝置越耗電。是以一個應用應該選擇适合它的精度,如果你的應用是一個車載導航應 用,kCLLocationAccuracyBestForNavigation是比較好的選擇,你可以使用汽車上的電瓶為裝置供電。如果你的應用為徒步 旅行者提供的導航應用,kCLLocationAccuracyHundredMeters是一個不錯的選擇。

第②行代碼設定distanceFilter屬性,它是距離過濾器,它定義了裝置移動更新位置資訊的最小距離,它的機關是米,本例設定了1000米。

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

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

調用startUpdatingLocation方法定位服務就會開啟,它根據設定的條件,不斷請求回調新的位置信 息。是以開啟這個方法一定要慎重,要在最合适的時候開啟,在視圖控制器的聲明周期方法中viewWillAppear:是最合适的。與開啟服務對應的方法 是stopUpdatingLocation方法,它的調用是在視圖控制器的viewWillDisappear:方法中調用的,代碼如下:

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

viewWillDisappear:在視圖消失(應用退到背景)時調用,能夠保證最及時地關閉定位服務,這是負責 任的做法。在iOS 6之後請求有所變化,定位服務應用退入台後可以延遲更新位置資訊,其中 allowDeferredLocationUpdatesUntilTraveled:timeout:方法可以設定延遲更新,進而使得應用在背景不再 更新位置資訊。關閉延遲更新使用disallowDeferredLocationUpdates方法實作。此外,在iOS 6之後新增 pausesLocationUpdatesAutomatically屬性,它能設定自動暫停位置更新,定位服務的開啟和暫停管理權交給系統,這樣會更加合理和簡單。

一旦定位服務開啟,并設定好了CLLocationManager委托屬性delegate後,當使用者裝置移動到達過濾距離時,就會回調委托方法,與定位服務有關的方法有兩個:

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

locationManager:didFailWithError: 定位失敗;

實作CLLocationManager委托代碼如下:

  1. #pragma mark Core Location委托方法用于實作位置的更新   
  2. - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations   
  3.     {   
  4.     CLLocation * currLocation = [locations lastObject];
  5.     // 緯度 
  6.     NSString *txtLat = [NSString stringWithFormat:@"%3.5f", 
  7.     currLocation.coordinate.latitude];    
  8.     // 經度   
  9.     NSString *txtLng = [NSString stringWithFormat:@"%3.5f",  
  10.     currLocation.coordinate.longitude];  
  11.     }   
  12. - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error   
  13.     {   
  14.     NSLog(@”error: %@”,error);   
  15.     }   

繼續閱讀