iOS學習——自動定位,ios定位
最近在項目中需要做自動定位功能,就是你在參加會議通過掃描二維碼簽到的時候自動定位並將你的定位資訊在簽到中上傳,這樣可以避免我們進行假簽到。在這個功能中,主要用到的是系統內建的定位模組,首先我們是需要配置定位功能的參數,然後當我們定位成功時調用特定的方法進行相應操作就可以了,當然,在定位失敗時我們也可以進行相應的操作,這些都有對應的一些回調方法,我們只需要重寫對應的回調方法就可以實現對應的功能了。
首先,我們用到的系統內建的定位模組是: <CoreLocation/CoreLocation.h> ,定位成功/失敗的方法都是通過代理 CLLocationManagerDelegate 來完成的,所以我們在需啊喲進行定位的類中也需要繼承自代理,並實現對應的一些方法才能成功完成回調。在定位功能的調用中,主要分為兩步:1、定位參數的配置;2、代理回調方法的實現。
一 定位參數的配置
定位參數的配置主要是通過系統的定位管理器CLLocationManager進行配置,參數配置的幾個要點主要是設定代理,設定定址精度,然後開啟定位。當然,這些參數的配置的前提是我們的手機已經對我們的項目進行了地理位置的授權,所以我們再配置之前需要對當前定位許可權進行判斷,通過 [CLLocationManager locationServicesEnabled] 方法可以直接得到定位許可權是否開啟,如果有對應的許可權,我們就可以進行對應的配置資訊,否則我們無法進行對應的配置,這時候我們可以彈出一個對話方塊進行提示使用者如何開啟定位許可權,在我們的項目中因為不需要進行提示,所以沒有對應的代碼模組。
- (void)viewDidLoad { [super viewDidLoad]; //配置定位資訊 [self configLocation];}- (void)configLocation{ self.place = @""; //判斷定位許可權是否開啟 if ([CLLocationManager locationServicesEnabled]) { locationManager = [[CLLocationManager alloc] init]; locationManager.delegate = self; //設定定址精度 locationManager.desiredAccuracy = kCLLocationAccuracyBest; locationManager.distanceFilter = 100.0f; //開始定位 [locationManager startUpdatingLocation]; } else { //如果定位許可權沒有開啟,可以進行相應的提示 //具體代碼省略 }}
二 代理方法的回調
在前面我們說過了,我們的類需要繼承CLLocationManagerDelegate代理,並實現其中的一些方法才能在定位成功/失敗時能夠正確地調用對應的代理方法。主要用到的代理方法有兩個,一個是成功時調用,一個是失敗時調用,具體代碼如下。在定位失敗時,我們首先可以彈框提示定位失敗的原因,接著我們可以選擇重新置放,或者我們也可以選擇限制連續定位失敗多少次後就不再進行定位了,具體需要實現的方法大家可以根據需要進行配置和開發。
#pragma mark - CLLocationManagerDelegate//定位成功的回調,在這裡我們配置我們的位置資訊-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{ [locationManager stopUpdatingLocation]; CLLocation *currentLoc = [locations lastObject]; CLGeocoder *geoCoder = [[CLGeocoder alloc] init]; //利用經緯度進行反編譯擷取位置資訊 [geoCoder reverseGeocodeLocation:currentLoc completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) { if (placemarks.count > 0) { //擷取當前定位資訊 CLPlacemark *placeMark = [placemarks firstObject]; if (placeMark) { self.place = [NSString stringWithFormat:@"%@%@%@%@",placeMark.administrativeArea,placeMark.locality,placeMark.subLocality,ZYIsNullOrEmpty(placeMark.thoroughfare)?@"":placeMark.thoroughfare]; } } }];}//定位失敗時調用- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{ [locationManager startUpdatingLocation];}