iOS定位
1.首先先导入CoreLocation.framework,在Build Phases ->Link Binary With Libraries
2.创建一个单例,或直接在当前工程,导入头文件 #import <CoreLocation/CoreLocation.h>,并设置代理NSObject<CLLocationManagerDelegate>。
3.注意事项
//从iOS 6开始,苹果在保护用户隐私方面做了很大的加强,以下操作都必须经过用户批准授权:要想获得用户的位置,想访问用户的通讯录、日历、相机、相册等;当想访问用户的隐私信息时,系统会自动弹出一个对话框让用户授权。 // //可以在Info.plist中设置NSLocationUsageDescription说明定位的目的(Privacy - Location Usage Description) // //从iOS 8开始,用户定位分两种情况 //总是使用用户位置:NSLocationAlwaysUsageDescription //使用应用时定位:NSLocationWhenInUseDescription //当想访问用户的隐私信息时,系统会自动弹出一个对话框让用户授权 //*打开定位服务 //*需要在info.plist文件中添加(以下二选一,两个都添加默认使用NSLocationWhenInUseUsageDescription): //*NSLocationWhenInUseUsageDescription 允许在前台使用时获取GPS的描述 //*NSLocationAlwaysUsageDescription 允许永远可获取GPS的描述 //地图分为,地理编码是通过地址得到经纬度,地理反编码是通过经纬度得到地址 //开始定位
4.代码如下
//.h文件 + (KLocation *)shareLocation; /** * 开启定位 */ - (void)startLocation; /** * 关闭定位 */ - (void)stopLocation;
+ (KLocation *)shareLocation{ static KLocation *location = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ location = [[KLocation alloc] init]; }); return location; } - (instancetype)init{ if (self = [super init]) { _entity = [KEntity shareEntity]; } return self; } //1.iOS8中定位服务的变化:CLLocationManager协议方法不响应,无法回掉GPS方法,不出现获取权限提示,解决方法如下, //如果需要仅在前台定位,你在调用startUpdatingLocation 前需要调用requestWhenInUseAuthorization // //如果需要在前后台定位,你在调用startUpdatingLocation 前需要调用requestAlwaysAuthorization // //在plist文件中添加NSLocationWhenInUseUsageDescription或(与)NSLocationAlwaysUsageDescription字段: //找到info.plist文件->右击->Open As->Source Code->在尾部的</dict>标签之前添加以下一个或两个: //<key>NSLocationWhenInUseUsageDescription</key><string>需要定位</string> //<key>NSLocationAlwaysUsageDescription</key><string>需要定位</string> //2.用户隐私的保护 //从iOS 6开始,苹果在保护用户隐私方面做了很大的加强,以下操作都必须经过用户批准授权:要想获得用户的位置,想访问用户的通讯录、日历、相机、相册等;当想访问用户的隐私信息时,系统会自动弹出一个对话框让用户授权。 // //可以在Info.plist中设置NSLocationUsageDescription说明定位的目的(Privacy - Location Usage Description) // //从iOS 8开始,用户定位分两种情况 //总是使用用户位置:NSLocationAlwaysUsageDescription //使用应用时定位:NSLocationWhenInUseDescription //当想访问用户的隐私信息时,系统会自动弹出一个对话框让用户授权 //*打开定位服务 //*需要在info.plist文件中添加(以下二选一,两个都添加默认使用NSLocationWhenInUseUsageDescription): //*NSLocationWhenInUseUsageDescription 允许在前台使用时获取GPS的描述 //*NSLocationAlwaysUsageDescription 允许永远可获取GPS的描述 //地图分为,地理编码是通过地址得到经纬度,地理反编码是通过经纬度得到地址 //开始定位 - (void)startLocation{ _locationManager = [[CLLocationManager alloc] init]; _locationManager.delegate = self; _locationManager.desiredAccuracy = kCLLocationAccuracyBest; //开启定位 [_locationManager requestWhenInUseAuthorization]; // [_locationManager requestAlwaysAuthorization]; if ([_locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) { NSLog(@"requestWhenInUseAuthorization"); [_locationManager requestWhenInUseAuthorization]; } //开始定位,不断调用其代理方法 [_locationManager startUpdatingLocation]; } //停止定位 - (void)stopLocation{ } //通过定位,获取地址,反地理编码 - (void)getAdressByLatitude:(CLLocationDegrees)latitude longitude:(CLLocationDegrees)longitude{ //初始化定位 CLLocation *cllocation = [[CLLocation alloc] initWithLatitude:latitude longitude:longitude]; _geocoder = [[CLGeocoder alloc] init]; //调用 geocoder 的block方法 reverseGeocodeLocation [_geocoder reverseGeocodeLocation:cllocation completionHandler:^(NSArray *placemarks, NSError *error) { CLPlacemark *placeMark = [placemarks lastObject]; //获取地址 NSDictionary *dict = placeMark.addressDictionary; //地址 NSString *administrativeArea = placeMark.administrativeArea; //省 NSLog(@"City:%@",[dict objectForKey:@"City"]); NSLog(@"country%@",[dict objectForKey:@"Country"]); NSLog(@"FormattedAddressLines%@",[dict objectForKey:@"FormattedAddressLines"]); NSLog(@"name%@",[dict objectForKey:@"Name"]); NSLog(@"State%@",[dict objectForKey:@"State"]); NSLog(@"Street%@",[dict objectForKey:@"Street"]); NSLog(@"SubLocality%@",[dict objectForKey:@"SubLocality"]); NSLog(@"SubThoroughfare%@",[dict objectForKey:@"SubThoroughfare"]); NSLog(@"Thoroughfare%@",[dict objectForKey:@"Thoroughfare"]); NSLog(@"administrativeArea%@",administrativeArea); _entity.latitude = [NSString stringWithFormat:@"%f",latitude]; _entity.longitude = [NSString stringWithFormat:@"%f",longitude]; _entity.city = [NSString stringWithFormat:@"%@",[dict objectForKey:@"City"]]; _entity.district = [NSString stringWithFormat:@"%@",[dict objectForKey:@"SubLocality"]]; _entity.province = administrativeArea; }]; } //2016-04-11 18:10:35.980 HopeHelpServer[7518:2567331] City:北京市 //331] name中国北京市西城区展览路街道桃柳园西巷16号A座 //2016-04-11 18:10:35.980 HopeHelpServer[7518:2567331] State北京市 //2016-04-11 18:10:35.980 HopeHelpServer[7518:2567331] Street桃柳园西巷16号A座 //2016-04-11 18:10:35.980 HopeHelpServer[7518:2567331] SubLocality西城区 //2016-04-11 18:10:35.981 HopeHelpServer[7518:2567331] SubThoroughfare16号A座 //2016-04-11 18:10:35.981 HopeHelpServer[7518:2567331] Thoroughfare桃柳园西巷 #pragma mark --- delegate - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{ //获取用户的位置 _location = [locations lastObject]; CLLocationCoordinate2D coordinate = _location.coordinate; NSLog(@"纬度:%f 经度:%f", coordinate.latitude, coordinate.longitude); //获取用户详细信息 [self getAdressByLatitude:coordinate.latitude longitude:coordinate.longitude]; // 2.停止定位 [manager stopUpdatingLocation]; } - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{ }
将来的自己,会感谢现在不放弃的自己!