相信各位做開發(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ā)的道路上共同成長。謝謝!??!