CC's blog

CC的技术博客 专注于 it 互联网的技术爱好者

对于原生定位的封装

摘要

此封装可用于IOS8.0以上. 注意: // 兼容iOS8.0版本 / Info.plist里面手动加上2项 NSLocationAlwaysUsageDescription YES NSLocationWhenInUseUsageDescription YES

.h

//
//  LBSManager.h
//  ingage
//
//  Created by bear on 16/9/19.
//  Copyright © 2016年 com. All rights reserved.
//

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

@interface LBSManager : NSObject<CLLocationManagerDelegate> {
    CLLocationManager *manager;
    
    // block的申明 定义
    void (^locationCallback) (double lat, double lng);
}

// 申明一个 cb的对象
+ (void) geLocaltion:(  void (^)(double lat, double lng) )cb;
+ (void) stop;

@end

.m

//
//  LBSManager.m
//  ingage
//
//  Created by bear on 16/9/19.
//  Copyright © 2016年 com. All rights reserved.
//

#import "LBSManager.h"



@implementation LBSManager



+ (id) sharedLBSManager{
    static id s;
    if (s == nil) {
        s = [[LBSManager alloc] init];
    }
    return s;
}
- (id)init {
    self = [super init];
    if (self) {
        // 打开定位 然后得到数据
        manager = [[CLLocationManager alloc] init];
        manager.delegate = self;
        manager.desiredAccuracy = kCLLocationAccuracyBest;
        
        // 兼容iOS8.0版本
        /* Info.plist里面加上2项
         NSLocationAlwaysUsageDescription      Boolean YES
         NSLocationWhenInUseUsageDescription   Boolean YES
         */
        
        // 请求授权 requestWhenInUseAuthorization用在>=iOS8.0上
        // respondsToSelector: 前面manager是否有后面requestWhenInUseAuthorization方法
        // 1. 适配 动态适配
        if ([manager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
            [manager requestWhenInUseAuthorization];
            [manager requestAlwaysAuthorization];
        }
        // 2. 另外一种适配 systemVersion 有可能是 8.1.1
        float osVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
        if (osVersion >= 8) {
            [manager requestWhenInUseAuthorization];
            [manager requestAlwaysAuthorization];
        }
    }
    return self;
}
- (void) geLocaltion:(  void (^)(double lat, double lng) )cb {
    if ([CLLocationManager locationServicesEnabled] == FALSE) {
        return;
    }
    // block一般赋值需要copy
    locationCallback = [cb copy];
    
    // 停止上一次的
    [manager stopUpdatingLocation];
    // 开始新的数据定位
    [manager startUpdatingLocation];
}

+ (void) geLocaltion:(  void (^)(double lat, double lng) )cb {
    [[LBSManager sharedLBSManager] geLocaltion:cb];
}

- (void) stop {
    [manager stopUpdatingLocation];
}
+ (void) stop {
    [[LBSManager sharedLBSManager] stop];
}

// 每隔一段时间就会调用
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
    for (CLLocation *loc in locations) {
        CLLocationCoordinate2D l = loc.coordinate;
        double lat = l.latitude;
        double lnt = l.longitude;
        
        // 使用blocks 调用blocks
        if (locationCallback) {
            locationCallback(lat, lnt);
        }
    }
}

@end

使用

调用方式:
//只获取一次定位
        __block  BOOL isOnece = YES;
        [LBSManager geLocaltion:^(double lat, double lng) {
            isOnece = NO;
            
            //只打印一次经纬度
            NSLog(@"lat lng (%f, %f)", lat, lng);
            
            if (!isOnece) {
                [LBSManager stop];
            }
        }];

 //如果要一直持续获取定位则
    [LBSManager geLocaltion:^(double lat, double lng) {
        
        //不断的打印经纬度
        NSLog(@"lat lng (%f, %f)", lat, lng);
    }];
none

添加新评论