WeChat/BAQMUIDemo/BAKit/BAKit_Custom/BAKit_Location/BAKit_Location.m

/*!
 *  @header BAKit.h
 *          BABaseProject
 *
 *  @brief  BAKit
 *
 *  @author 博爱
 *  @copyright    Copyright © 2016年 博爱. All rights reserved.
 *  @version    V1.0
 */

//                            _ooOoo_
//                           o8888888o
//                           88" . "88
//                           (| -_- |)
//                            O\ = /O
//                        ____/`---'\____
//                      .   ' \\| |// `.
//                       / \\||| : |||// \
//                     / _||||| -:- |||||- \
//                       | | \\\ - /// | |
//                     | \_| ''\---/'' | |
//                      \ .-\__ `-` ___/-. /
//                   ___`. .' /--.--\ `. . __
//                ."" '< `.___\_<|>_/___.' >'"".
//               | | : `- \`.;`\ _ /`;.`/ - ` : | |
//                 \ \ `-. \_ __\ /__ _/ .-` / /
//         ======`-.____`-.___\_____/___.-`____.-'======
//                            `=---='
//
//         .............................................
//                  佛祖镇楼                  BUG辟易
//          佛曰:
//                  写字楼里写字间，写字间里程序员；
//                  程序人员写程序，又拿程序换酒钱。
//                  酒醒只在网上坐，酒醉还来网下眠；
//                  酒醉酒醒日复日，网上网下年复年。
//                  但愿老死电脑间，不愿鞠躬老板前；
//                  奔驰宝马贵者趣，公交自行程序员。
//                  别人笑我忒疯癫，我笑自己命太贱；
//                  不见满街漂亮妹，哪个归得程序员？

/*
 
 *********************************************************************************
 *
 * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我，我会及时修复bug
 *
 * QQ     : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】)
 * 微博    : 博爱1616
 * Email  : 137361770@qq.com
 * GitHub : https://github.com/boai
 * 博客    : http://boaihome.com
 
 *********************************************************************************
 
 */


#import "BAKit_Location.h"


@interface BAKit_Location ()<CLLocationManagerDelegate>

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

@implementation BAKit_Location

- (instancetype)init
{
    if (self = [super init])
    {
        [self startPositioningSystem];
    }
    return self;
}

- (void)startPositioningSystem
{
    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.delegate = self;
    if ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)])
    {
        [self.locationManager requestWhenInUseAuthorization];
    }
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    self.locationManager.distanceFilter = kCLDistanceFilterNone;
    [self.locationManager startUpdatingLocation];
}

#pragma mark CLLocationManagerDelegate
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(nonnull NSArray<CLLocation *> *)locations
{
    BAKit_WeakSelf
//    static dispatch_once_t onceToken;
//    dispatch_once(&onceToken, ^{
//        BAKit_StrongSelf
        if (self.locatingBlock)
        {
            self.locatingBlock();
        }
//    });
    CLGeocoder * geoCoder = [[CLGeocoder alloc] init];
    [geoCoder reverseGeocodeLocation:[locations lastObject] completionHandler:^(NSArray *placemarks, NSError *error) {
        BAKit_StrongSelf
        for (CLPlacemark * placemark in placemarks)
        {
//            NSDictionary *location = [placemark addressDictionary];
//            static dispatch_once_t onceToken;
//            dispatch_once(&onceToken, ^{
                if (self.getCurrentLocationBlock)
                {
                    self.getCurrentLocationBlock(placemark);
                }
//            });
        }
    }];
    [manager stopUpdatingLocation];
}

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
    if ([error code] == kCLErrorDenied)
    {
        if (self.refuseToUsePositioningSystemBlock)
        {
            self.refuseToUsePositioningSystemBlock(@"已拒绝使用定位系统");
        }
    }
    BAKit_WeakSelf
    if ([error code] == kCLErrorLocationUnknown)
    {
//        static dispatch_once_t onceToken;
//        dispatch_once(&onceToken, ^{
            BAKit_StrongSelf
            if (self.locateFailureBlock)
            {
                self.locateFailureBlock(@"无法获取位置信息");
            }
//        });
    }
}

@end
