iOS 通过系统方法获取用户地理位置

当App需要用户的位置信息时,我们可以体统自带的CoreLocation来获取,接下来就是所有的流程。
1.准备工作

1.1. 在info.plist 添加 Privacy - Location Always Usage Description或者Privacy - Location When In Use Usage Description 权限,类型为String,value中一定要有值, 来告诉用户使用定位服务的目的(一直定位/当用户使用时定位)

1.2.在程序的Build PhasesLink Binary With Libraries导入CoreLocation.framework

2.导入.m文件中,申请权限

在系统刚启动时申请获取用户信息的权限,在AppDelegate.m 中申请使用用户的地理位置权限,具体在哪需要地理位置信息,那就在哪实现获取地理位置的相关代理。
下面的🌰是在AppDelegate.m 中申请的地理位置权限 ,在BaseController里实现代理方法。

@interface AppDelegate () <DBSessionDelegate,CLLocationManagerDelegate>  //添加代理
    @property (nonatomic, strong) CLLocationManager  *cllocationManager;  
@end

@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.rootViewController = [UIViewController new];
    [self.window makeKeyAndVisible];
    [self getUserLocation];
    return YES;
}

- (void) getUserLocation {
    int status=[CLLocationManager authorizationStatus];
    if (![CLLocationManager locationServicesEnabled] || status < 3) {
      if ([[UIDevice currentDevice].systemVersion floatValue] >= 8)  {
         _cllocationManager = [[CLLocationManager alloc] init];
         [_cllocationManager requestAlwaysAuthorization];
         [_cllocationManager requestWhenInUseAuthorization];
       }
    }
}
    // 如果在Appdelegate中需要地理位置,那么在这实现代理方法来获取地理位置信息
    @end

在BaseController.m使用时实现代理方法

#import "BaseController.h"
#import <CoreLocation/CoreLocation.h>
@interface BaseController ()<CLLocationManagerDelegate>
  @property (nonatomic, strong) CLLocationManager  *locMgr;
@end

@implementation BaseController
#pragma mark-懒加载
- (CLLocationManager *)locMgr {
    if (_locMgr==nil) {
        //1.创建位置管理器(定位用户的位置)
        _locMgr=[[CLLocationManager alloc]init];
        //2.设置代理
         _locMgr.delegate=self;
         }
    return _locMgr;
}
- (void)viewDidLoad {
    [super viewDidLoad];

    //判断用户定位服务是否开启
    if ([CLLocationManager locationServicesEnabled]) {
        //开始定位用户的位置
        [self.locMgr startUpdatingLocation];
        //每隔多少米定位一次(这里的设置为任何的移动)
        self.locMgr.distanceFilter=kCLDistanceFilterNone;
        //设置定位的精准度,一般精准度越高,越耗电(这里设置为精准度最高的,适用于导航应用)
        self.locMgr.desiredAccuracy=kCLLocationAccuracyBestForNavigation;
    } else {
        //不能定位用户的位置
        //1.提醒用户检查当前的网络状况
        //2.提醒用户打开定位开关
    }     
    //测试方法,计算两个位置之间的距离
    [self countDistance];
}

#pragma mark - CLLocationManagerDelegate
/**
  *  当定位到用户的位置时,就会调用(调用的频率比较频繁)
  */
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {
    //locations数组里边存放的是CLLocation对象,一个CLLocation对象就代表着一个位置,获取最后的一个位置
    CLLocation *currentLocation = [locations lastObject];
    //当定位成功后,如果horizontalAccuracy大于0,说明定位有效  horizontalAccuracy,该位置的纬度和经度确定的圆的中心,并且这个值表示圆的半径。负值表示该位置的纬度和经度是无效的
    //维度:currentLocation.coordinate.latitude
    //经度:currentLocation.coordinate.longitude
    CLLocationCoordinate2D coor = currentLocation.coordinate;
    NSDictionary *location = @{@"latitude":@(coor.latitude),@"longitude":@(coor.longitude),@"horizontalAccuracy":@(currentLocation.horizontalAccuracy)};
    [PBCacheUtil setUserLocation:location];
    //停止更新位置(如果定位服务不需要实时更新的话,那么应该停止位置的更新)
    [self.locMgr stopUpdatingLocation];
}

//获取地理位置失败,赋予默认值
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(nonnull NSError *)error {
   NSDictionary *location = @{@"latitude":@(0.000000),@"longitude":@(0.000000),@"horizontalAccuracy":@(0.000000)};
   [PBCacheUtil setUserLocation:location];
}

//计算两个位置之间的距离
-(void)countDistance {
   //根据经纬度创建两个位置对象
   CLLocation *loc1=[[CLLocation alloc]initWithLatitude:40 longitude:116];
   CLLocation *loc2=[[CLLocation alloc]initWithLatitude:41 longitude:116];
   //计算两个位置之间的距离
   CLLocationDistance distance=[loc1 distanceFromLocation:loc2];
   NSLog(@"(%@)和(%@)的距离=%fM",loc1,loc2,distance);
}
@end
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 作者:柳骏原文地址:http://www.ios520junge.com/ 初学地图时,觉得地图是个很高深的玩意儿...
    行走的苹果哥阅读 1,398评论 0 4
  • 简介 在移动互联网时代,移动app能解决用户的很多生活琐事,比如 周边:找餐馆、找KTV、找电影院等等 导航:根据...
    JonesCxy阅读 1,267评论 1 1
  • *初学地图时,觉得地图是个很高深的玩意儿,导航、定位、检索这得运用多少算法和核心动画的知识点啊,于是一直排斥 * ...
    柳骏阅读 3,920评论 11 22
  • 因为要结局swift3.0中引用snapKit的问题,看到一篇介绍Xcode8,swift3变化的文章,觉得很详细...
    uniapp阅读 4,537评论 0 12
  • 出自http://my.oschina.net/are1OfBlog/blog/420034 摘要 现在很多社交、...
    JJO阅读 4,176评论 4 19