iOS開發(fā)-iOS原生定位簡單封裝

相信各位做開發(fā)的程序猿們在開發(fā)中使用到定位功能的項(xiàng)目應(yīng)該挺多的,iOS原生的定位非常簡單且快速,為了在使用過程中讓大家覺得更加的簡單方便一些,小編對iOS原聲的定位做了進(jìn)一步的簡單封裝,具體代碼如下:
1、創(chuàng)建存儲地理位置的模型,導(dǎo)入<CoreLocation/CoreLocation.h>(方便存儲經(jīng)緯度)

#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>

@interface Location : NSObject

//國家
@property (nonatomic, copy) NSString * country;
//省 直轄市
@property (nonatomic, copy) NSString * administrativeArea;
// 地級市 直轄市區(qū)
@property (nonatomic, copy) NSString * locality;
//縣 區(qū)
@property (nonatomic, copy) NSString * subLocality;
//街道
@property (nonatomic, copy) NSString * thoroughfare;
//子街道
@property (nonatomic, copy) NSString * subThoroughfare;

//經(jīng)度
@property (nonatomic, assign) CLLocationDegrees longitude;
//緯度
@property (nonatomic, assign) CLLocationDegrees latitude;

@end

大家使用的時(shí)候可以將以上屬性命名為自己容易記的名字。

2、創(chuàng)建定位類,導(dǎo)入模型頭文件,并設(shè)置協(xié)議及代理方法

#import <Foundation/Foundation.h>
#import "Location.h"

@protocol RHLocationDelegate;

@interface RHLocation : NSObject

@property (nonatomic, weak) id<RHLocationDelegate> delegate;

- (void)beginUpdatingLocation;
@end
@protocol RHLocationDelegate <NSObject>

- (void)locationDidEndUpdatingLocation:(Location *)location;
@end

3、在.m文件中創(chuàng)建定位CLLocationManager的對象,并遵守代理協(xié)議。使用時(shí)只需要遵循本類的協(xié)議代理,調(diào)用beginUpdatingLocation方法即可。在代理回調(diào)里邊可以通過存儲位置信息的模型類獲取到想要的位置信息。

#import "RHLocation.h"

@interface RHLocation () <CLLocationManagerDelegate>

@property (nonatomic, strong) CLLocationManager * locationManager;
@end

@implementation RHLocation

#pragma mark - public
- (void)beginUpdatingLocation {
    
    [self.locationManager startUpdatingLocation];
}

#pragma mark - location delegate
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {
    
    //獲取新的位置
    CLLocation * newLocation = locations.lastObject;
    
    //創(chuàng)建自定制位置對象
    Location * location = [[Location alloc] init];

    //存儲經(jīng)度
    location.longitude = newLocation.coordinate.longitude;
    
    //存儲緯度
    location.latitude = newLocation.coordinate.latitude;
    
    //根據(jù)經(jīng)緯度反向地理編譯出地址信息
    CLGeocoder * geocoder = [[CLGeocoder alloc] init];
    
   [geocoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
        
        if (placemarks.count > 0) {
            
            CLPlacemark * placemark = placemarks.firstObject;
            
            //存儲位置信息
            location.country = placemark.country;
            location.administrativeArea = placemark.administrativeArea;
            location.locality = placemark.locality;
            location.subLocality = placemark.subLocality;
            location.thoroughfare = placemark.thoroughfare;
            location.subThoroughfare = placemark.subThoroughfare;
        }
    }];

    //設(shè)置代理方法
    if ([self.delegate respondsToSelector:@selector(locationDidEndUpdatingLocation:)]) {
        
        [self.delegate locationDidEndUpdatingLocation:location];
    }
    //系統(tǒng)會一直更新數(shù)據(jù),直到選擇停止更新,因?yàn)槲覀冎恍枰@得一次經(jīng)緯度即可,所以獲取之后就停止更新
    [manager stopUpdatingLocation];
}

#pragma mark - setter and getter
- (CLLocationManager *)locationManager {
    
    if (!_locationManager) {
        
        _locationManager = [[CLLocationManager alloc] init];
        
        _locationManager.delegate = self;
        
        // 設(shè)置定位精確度
        _locationManager.desiredAccuracy = kCLLocationAccuracyBest;
        
        // 設(shè)置過濾器為無
        _locationManager.distanceFilter = kCLDistanceFilterNone;
        
        // 取得定位權(quán)限,有兩個(gè)方法,取決于你的定位使用情況
        // 一個(gè)是 requestAlwaysAuthorization
        // 一個(gè)是 requestWhenInUseAuthorization
        [_locationManager requestAlwaysAuthorization];//ios8以上版本使用。
    }
    return _locationManager;
}
@end

截止到這里,我們就算是封裝完成,在使用的時(shí)候只需要導(dǎo)入RHLocation的頭文件即可,遵循代理協(xié)議即可。

4、使用:Xcode8.0在使用之前需要在plist里邊添加兩個(gè)字段Privacy - Location Always Usage Description和Privacy - Location When In Use Usage Description,否則會出錯。如果是Xcode8.0以下版本同樣需要添加Location Always Usage Description和Location When In Use Usage Description兩個(gè)字段。

#import "ViewController.h"
//導(dǎo)入頭文件
#import "RHLocation.h"

@interface ViewController () <RHLocationDelegate>
//設(shè)置成屬性
@property (nonatomic, strong) RHLocation * location;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    //開始更新定位
    [self.location beginUpdatingLocation];
}

#pragma mark - RHLocation delegate
- (void)locationDidEndUpdatingLocation:(Location *)location {
    
    //在此對需要的數(shù)據(jù)進(jìn)行處理使用
    NSLog(@"國家:%@",location.country);
    NSLog(@"省/直轄市:%@",location.administrativeArea);
    NSLog(@"地級市/直轄市區(qū):%@",location.locality);
    NSLog(@"縣/區(qū):%@",location.subLocality);
    NSLog(@"街道:%@",location.thoroughfare);
    NSLog(@"子街道:%@",location.subThoroughfare);
    
    NSLog(@"經(jīng)度:%lf",location.longitude);
    NSLog(@"緯度:%lf",location.latitude);
}

//懶加載創(chuàng)建自定制的位置類對象
- (RHLocation *)location {
    
    if (!_location) {
        
        _location = [[RHLocation alloc] init];
        
        _location.delegate = self;
    }
    return _location;
}

OK!到此結(jié)束,代碼已經(jīng)說得很詳細(xì)了,就不傳demo了。

最后還是希望能夠幫助到有需要的程序猿們,同時(shí)希望大家能夠多多提意見,愿同是程序猿的我們在開發(fā)的道路上共同成長。謝謝!??!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容