定位

//需要导入系统动画定位的头文件

#import

//类的扩展(私有的属性.方法)

@interface ViewController() //提示作用

{

//成员变量(自动释放),全局变量在dealloc方法中释放,dealloc方法会在当前类对象的引用计数变成0的时候调用,根视图对象是不会释放掉的,除非切换根视图或者关闭该应用

//定位对象

CLLocationManager *manager;

//地理编码对象(经纬度)

CLGeocoder *_coder;

}

//系统适配屏幕适配图片适配

//Xcode8,对应ios10    Xcode7,对应ios9  Xcode6,对应ios8   Xcode5,对应ios7

//判断定位是否可用(真机可用)

if([CLLocationManager locationServicesEnabled]) {

NSLog(@"---定位可用");

} else {

NSLog(@"+++定位不可用");

}

//定位方式GPS .基站. WiFi,到底用哪个定位,不确定(看苹果公司的定位系统)

manager = [[CLLocationManager alloc] init];

//移动多少距离定位一次(频繁,耗电).精确度越高,越费电

manager.distanceFilter = kCLLocationAccuracyKilometer;

//精确度

manager.desiredAccuracy = 100;

//设置代理

manager.delegate = self;

//开始定位

[manager startUpdatingLocation];

//条件编译,如果当前系统存在这个宏,就编译里面的语句,否则不编译

#ifdef __IPHONE_8_0

//从ios8开始需要请求授权保护用户'隐私'

//当你使用到定位的时候开启点位

[manager requestWhenInUseAuthorization];

//一直打开定位

[manager requestAlwaysAuthorization];

/*

百度地图---下面的'地图开发平台'---ios开发----'定位功能'中可找到

需要在Info.plist文件中对应的添加如下配置:

(1)NSLocationAlwaysUsageDescription

(2)NSLocationWhenInUseUsageDescription

*/

#endif

//模拟器的Debug的Location---Custom Location (经纬度-->百度地图,拾取工具)

//判断朝向

if([CLLocationManager headingAvailable]) {

NSLog(@"朝向服务可用---");

} else {

NSLog(@"朝向不可用");

}

//更新朝向必须真机测试

[manager startUpdatingHeading];

//初始化对象

_coder= [[CLGeocoderalloc]init];

//编码

[_coder geocodeAddressString:@"福建省福州市" completionHandler:^(NSArray *_Nullableplacemarks,NSError*_Nullableerror) {

CLPlacemark *mark = [placemarkslastObject];

CLLocation *loc = mark.location;

CLLocationCoordinate2D coor = loc.coordinate;

CLLocationDegrees lat = coor.latitude;

CLLocationDegrees lon = coor.longitude;

NSLog(@"---%f====%f",lat,lon);

}];

#pragma mark -- CLLocationManagerDelegate

//用户位置发生变化的时候回调用

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray  *)locations__OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_6_0) {

//定位只能在国内

CLLocation *loc = [locations lastObject];

//海拔

CLLocationDistance alti = loc.altitude;

//经纬度

CLLocationCoordinate2D coor = loc.coordinate;

//纬度

CLLocationDegrees lat = coor.latitude;

//经度

CLLocationDegrees lon = coor.longitude;

//不是真机alti===0000000

NSLog(@">>>>%f,>>>>>>%f,>>>>>%f",alti,lat,lon);

//这里的location对象需要自己创建

CLLocation *loc2 = [[CLLocation alloc] initWithLatitude:latlongitude:lon];

//反编码

[_coder reverseGeocodeLocation:loc2 completionHandler:^(NSArray  *_Nullableplacemarks,NSError *_Nullableerror) {

//CLPlacemark是位置位置

CLPlacemark *mark = [placemarks lastObject];

NSLog(@"%@",mark.addressDictionary);

//        NSLog(@"3333%@@",error);

}];

//系统地图是高德地图

//火星坐标系(有变差的坐标系);一般大公司有自己地图,用的是火星坐标

//地图的编码和反编码必须用同一套地图

//停止定位

//[manager stopUpdatingLocation];

}

//当用户朝向发生变化的时候调用

- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading {

//地磁北极不准容易受到磁场的干扰

CLLocationDirection mag = newHeading.magneticHeading;

//地理北极0---359.9 0是北方

CLLocationDirection north = newHeading.trueHeading;

//精确度

CLLocationDirection acc = newHeading.headingAccuracy;

}

你可能感兴趣的:(定位)