//
// GetLocation.h
// 智慧城
//
// Created by mac on 15/12/25.
// Copyright (c) 2015年 ZY. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>
@interface GetLocation : NSObject<CLLocationManagerDelegate>
@property (nonatomic,strong)CLLocation *location;
@property (nonatomic,strong)CLGeocoder *geocoder;
@property (nonatomic,strong)CLLocationManager *manager;
@property (nonatomic,copy)void(^LBlock)(NSString *cityName);
+ (instancetype)shareInstanceType;
- (void)getCurrentLocation;
@end
//
// GetLocation.m
// 智慧城
//
// Created by mac on 15/12/25.
// Copyright (c) 2015年 ZY. All rights reserved.
//
#import "GetLocation.h"
@implementation GetLocation
+ (instancetype)shareInstanceType{
static GetLocation *getLo = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
getLo = [[[self class] alloc] init];
});
return getLo;
}
- (CLLocationManager *)manager{
if (!_manager) {
_manager = [[CLLocationManager alloc] init];
_manager.delegate = self;
}
return _manager;
}
- (CLLocation *)location{
if (!_location) {
_location = [[CLLocation alloc] init];
}
return _location;
}
- (CLGeocoder *)geocoder{
if (!_geocoder) {
_geocoder = [[CLGeocoder alloc] init];
}
return _geocoder;
}
#pragma mark 对当前位置进行定位
- (void)getCurrentLocation{
//判断手机是否开启定位功能
BOOL isOpen = [CLLocationManager locationServicesEnabled];
if (isOpen) {
NSLog(@"定位开启");
}else{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"未开启定位" message:@"请打开手机定位" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
[alert show];
return;
}
//获取定位服务的授权状态
NSInteger status = [CLLocationManager authorizationStatus];
if (status == 0) {
//判断版本
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) {
//获取硬件定位授权
//应用使用时定位
// [self.manager requestAlwaysAuthorization];
//一直可以定位
[self.manager requestWhenInUseAuthorization];
// info.plist文件设置
//NSLocationAlwaysUsageDescription---我想在后台还访问您的位置
//NSLocationWhenInUseUsageDescription---我想在我的app开启的时候使用您的位置,可以吗?
}
}else if (status == 2){
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"手机未对本应用开启定位限制,请开启" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
[alert show];
return;
}
// 定位功能属性
//设置定位精度
self.manager.desiredAccuracy = kCLLocationAccuracyBest;
//设置定位频率
self.manager.distanceFilter = 100.f;
//开启定位
[self.manager startUpdatingLocation];
}
#pragma mark 反编码
- (void)getCityNameUseLatitude:(double)latitude withLongitude:(double)longitude{
_location = [[CLLocation alloc] initWithLatitude:latitude longitude:longitude];
[self.geocoder reverseGeocodeLocation:_location completionHandler:^(NSArray *placemarks, NSError *error) {
if (error) {
NSLog(@"反编码失败==%@",error);
}else{
//获取反编码的坐标
CLPlacemark *pm = [placemarks firstObject];
// country:国家
//administrativeArea:省份
//locality:城市
//subLocality:区
//thoroughfare:街道
//subThoroughfare:编码
NSLog(@"%@",[NSString stringWithFormat:@"%@-%@-%@-%@-%@-%@",pm.country,pm.administrativeArea,pm.location,pm.subLocality,pm.thoroughfare,pm.subThoroughfare]);
NSLog(@"地区个数:%ld",(unsigned long)placemarks.count);
for (CLPlacemark *place in placemarks) {
// NSLog(@"======");
[place.addressDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
if(_LBlock){
_LBlock(obj);
}
NSLog(@"%@:%@",key,obj);
}];
// NSLog(@"=====");
}
}
}];
}
#pragma mark 地理编码 输入地名
- (void)getCLLocationCoordinateWithCityName:(NSString *)cityName{
[self.geocoder geocodeAddressString:cityName completionHandler:^(NSArray *placemarks, NSError *error) {
if (error) {
NSLog(@"你输入的地名不存在");
}
//获取地标
CLPlacemark *pm = [placemarks firstObject];
//获取地理坐标
CLLocationCoordinate2D coor = pm.location.coordinate;
NSLog(@"经度:%.2f \n 纬度:%.2f",coor.longitude,coor.latitude);
NSLog(@"城市个数:%ld",(unsigned long)placemarks.count);
for (CLPlacemark *place in placemarks) {
[place.addressDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
NSLog(@"%@:%@",key,obj);
}];
}
}];
}
#pragma mark CLLocationDelegate
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
CLLocation *loaction = [locations firstObject];
//按CLLocationCoordinate2D:结构体获取定位的经纬度
/*typedef struct {
CLLocationDegrees latitude;
CLLocationDegrees longitude;
} CLLocationCoordinate2D;*/
CLLocationCoordinate2D coor = loaction.coordinate;
NSLog(@"%.2f %.2f",coor.latitude,coor.longitude);
[self getCityNameUseLatitude:coor.latitude withLongitude:coor.longitude];
}
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status{
NSLog(@"---%d",status);
switch (status) {
case 0:
NSLog(@"纬度应用授权做出判断");
break;
default:
break;
}
}
//开始检测某一个区域时调用的方法
- (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region{
NSLog(@"%s",__FUNCTION__);
}
//进入某一个区域调用的方法
- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region{
NSLog(@"%s",__FUNCTION__);
}
//离开某一个区域调用的方法
- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region{
NSLog(@"%s",__FUNCTION__);
}
@end