在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
這兩個字段沒什麼特别的意思,就是自定義提示使用者授權使用地理定位功能時的提示語。
2. 導入庫檔案 CoreLocation.framework
3. 導入庫标題 <CoreLocation/CoreLocation.h>, 遵循協定 CLLocationManagerDelegate
- MainViewController.h
-
#import<UIKit/UIKit.h>
#import<CoreLocation/CoreLocation.h>
-
@interface MainViewController:UIViewController<CLLocationManagerDelegate>
@property (strong, nonatomic) CLLocationManager *locationManager;
- @end
- MainViewController.m
- - (void) viewDidLoad {
- [super viewDidLoad];
- self.locationManager = [[CLLocationManager alloc]
- init];
- _locationManager.delegate = self;
- [_locationManager requestAlwaysAuthorization];
- _locationManager.desiredAccuracy = kCLLocationAccuracy
- Best; ①
- _locationManager.distanceFilter = 1000.0f; ②
- [_locationManger startUpdatingLocation];
- }
第① 行代碼設定desiredAccuracy屬性,它是一個非常重要的屬性,它的取值有6個常 量:kCLLocationAccuracyNearestTenMeters。精度10 米;kCLLocationAccuracyHundredMeters 。精度100 米;
kCLLocationAccuracyKilometer 。精度1000 米;
kCLLocationAccuracyThreeKilometers。精度3000米;
kCLLocationAccuracyBest 。裝置 使用電池供電時候,最高的精度;kCLLocationAccuracyBestForNavigation。導航情況下最高精度,一般要有外接電源時才能使用;
精度越高請求獲得位置資訊的時間就越短,這就意味着裝置越耗電。是以一個應用應該選擇适合它的精度,如果你的應用是一個車載導航應 用,kCLLocationAccuracyBestForNavigation是比較好的選擇,你可以使用汽車上的電瓶為裝置供電。如果你的應用為徒步 旅行者提供的導航應用,kCLLocationAccuracyHundredMeters是一個不錯的選擇。
第②行代碼設定distanceFilter屬性,它是距離過濾器,它定義了裝置移動更新位置資訊的最小距離,它的機關是米,本例設定了1000米。
初始化CLLocationManager完成之後,需要使用startUpdatingLocation方法開始定位服務。它是在ViewController.m的viewWillAppear:方法中,代碼如下:
- - (void)viewWillAppear:(BOOL)animated
- {
- [super viewWillAppear:animated];
- //開始定位
- [_locationManager startUpdatingLocation];
- }
調用startUpdatingLocation方法定位服務就會開啟,它根據設定的條件,不斷請求回調新的位置信 息。是以開啟這個方法一定要慎重,要在最合适的時候開啟,在視圖控制器的聲明周期方法中viewWillAppear:是最合适的。與開啟服務對應的方法 是stopUpdatingLocation方法,它的調用是在視圖控制器的viewWillDisappear:方法中調用的,代碼如下:
- - (void)viewWillDisappear:(BOOL)animated
- {
- [super viewWillDisappear:animated];
- //停止定位
- [_locationManager stopUpdatingLocation];
- }
viewWillDisappear:在視圖消失(應用退到背景)時調用,能夠保證最及時地關閉定位服務,這是負責 任的做法。在iOS 6之後請求有所變化,定位服務應用退入台後可以延遲更新位置資訊,其中 allowDeferredLocationUpdatesUntilTraveled:timeout:方法可以設定延遲更新,進而使得應用在背景不再 更新位置資訊。關閉延遲更新使用disallowDeferredLocationUpdates方法實作。此外,在iOS 6之後新增 pausesLocationUpdatesAutomatically屬性,它能設定自動暫停位置更新,定位服務的開啟和暫停管理權交給系統,這樣會更加合理和簡單。
一旦定位服務開啟,并設定好了CLLocationManager委托屬性delegate後,當使用者裝置移動到達過濾距離時,就會回調委托方法,與定位服務有關的方法有兩個:
locationManager:didUpdateLocations: 定位成功,是iOS 6新方法,替代之前的locationManager:didUpdateToLocation:fromLocation:方法;
locationManager:didFailWithError: 定位失敗;
實作CLLocationManager委托代碼如下:
- #pragma mark Core Location委托方法用于實作位置的更新
- - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
- {
- CLLocation * currLocation = [locations lastObject];
- // 緯度
- NSString *txtLat = [NSString stringWithFormat:@"%3.5f",
- currLocation.coordinate.latitude];
- // 經度
- NSString *txtLng = [NSString stringWithFormat:@"%3.5f",
- currLocation.coordinate.longitude];
- }
- - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
- {
- NSLog(@”error: %@”,error);
- }