1、首先在info.plist文件中设置有关位置有关的权限设置:
1.导入coreLocation库
2.在info.plist里设置权限
(以下二选一,两个都添加默认使用NSLocationWhenInUseUsageDescription):NSLocationWhenInUseUsageDescription:允许在前台使用时获取GPS的描述NSLocationAlwaysUsageDescription:允许永久使用GPS的描述
直接上代码:
// 引入:
#import <CoreLocation/CoreLocation.h>
// 遵守代理:
@interface ViewController () <CLLocationManagerDelegate>
/** 定位 */
@property CLLocationManager *locationmanager;//定位服务
@property (strong, nonatomic) NSString *strlatitude;//经度
@property (strong, nonatomic) NSString *strlongitude;//纬度
@property (strong, nonatomic) NSString *country; // 当前国家
@property (strong, nonatomic) NSString *province;
@property (strong, nonatomic) NSString *city; // 当前城市
@property (strong, nonatomic) NSString *district;
@property (strong, nonatomic) NSString *street;
@end
self.strlatitude = @"";
self.strlongitude = @"";
self.country =@"";//当前国家
self.city = @"";//当前的城市
self.street = @"";
详细代码:
-(IBAction)BtnLocationPress:(id)sender
{
[self getLocation];
}
-(void)getLocation
{
//判断定位功能是否允许
if ([CLLocationManager locationServicesEnabled]) {
self.locationmanager = [[CLLocationManager alloc]init];
self.locationmanager.delegate = self;
[self.locationmanager requestAlwaysAuthorization];
[self.locationmanager requestWhenInUseAuthorization];
//设置寻址精度
self.locationmanager.desiredAccuracy = kCLLocationAccuracyKilometer; //kCLLocationAccuracyBest;
self.locationmanager.distanceFilter = 500.0; // 设定distanceFilter可以在用户移动指定的距离后,触发更新事件(500米更新一次)
[self.locationmanager startUpdatingLocation];
} else {
//如果没有授权定位,提示开启
UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:@"允许定位" message:@"请在设置中打开定位" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *ensure = [UIAlertAction actionWithTitle:@"打开定位" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
[[UIApplication sharedApplication] openURL:url];
}];
UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];
[alertVC addAction:ensure];
[alertVC addAction:cancel];
[self.navigationController presentViewController:alertVC animated:YES completion:nil];
}
}
#pragma mark 定位成功后则执行此代理方法
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
{
//[self.locationmanager stopUpdatingHeading];
//旧址
CLLocation *currentLocation = [locations lastObject];
CLGeocoder *geoCoder = [[CLGeocoder alloc]init];
//打印当前的经度与纬度
YMLog(@"当前经度=%f 当前纬度=%f 当前高度=%f", currentLocation.coordinate.latitude, currentLocation.coordinate.longitude, currentLocation.altitude);
//反地理编码
[geoCoder reverseGeocodeLocation:currentLocation completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
if (placemarks.count > 0) {
CLPlacemark *placeMark = placemarks[0];
NSString *currentCity = placeMark.locality;
if (!currentCity) {
currentCity = @"无法定位当前城市";
}
// 经纬度:
self.strlatitude = [NSString stringWithFormat:@"%lf",currentLocation.coordinate.latitude];
self.strlongitude = [NSString stringWithFormat:@"%lf",currentLocation.coordinate.longitude];;
/*看需求定义一个全局变量来接收赋值(可以全局使用)*/
//NSString *country =placeMark.country;//当前国家
self.city = currentCity;//当前的城市
[self.btn_location self.city forState:UIControlStateNormal];
//NSString *street = placeMark.thoroughfare;
}
/**
if (placemarks.count > 0) {
CLPlacemark *placeMark = placemarks[0];
YMLog(@"当前用户所在城市:%@",placeMark.locality);
YMLog(@"%@",placeMark.country);//当前国家
YMLog(@"%@",placeMark.locality);//当前城市
YMLog(@"%@",placeMark.subLocality);//当前位置
YMLog(@"%@",placeMark.thoroughfare)//当前街道
YMLog(@"%@",placeMark.name);//具体地址 市 区 街道
NSString *address = [NSString stringWithFormat:@"%@%@%@",placeMark.locality,placeMark.subLocality,placeMark.name];
YMLog(@"%@",address);
[AppSingleInstance sharedInstance].currentUserAddress = address;
} else if (error == nil && placemarks.count == 0) {
YMLog(@"没有地址返回");
} else if (error) {
YMLog(@"%@",error);
}
*/
}];
}
#pragma mark CoreLocation delegate (定位失败)
//定位失败后调用此代理方法
-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
if (error.code == kCLErrorDenied) {
//访问被拒绝
YMLog(@"位置访问被拒绝");
} else if (error.code == kCLErrorLocationUnknown) {
YMLog(@"无法获取用户信息");
}
/**
//设置提示提醒用户打开定位服务
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"允许定位提示" message:@"将前往设置开启定位" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"打开定位" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
// [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString] options:@{} completionHandler:nil];
}];
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];
[alert addAction:okAction];
[alert addAction:cancelAction];
[self presentViewController:alert animated:YES completion:nil];
*/
}
二、笔记📒代码:
xcode定位设置的副本.png/// 6、获取定位:经、纬度,判断是否开启定位权限
- (void)gainCurrentLoaction_latitudeAndLongitude {
self.locationmanager = [[CLLocationManager alloc]init];
self.locationmanager.delegate = self;
[self.locationmanager stopUpdatingLocation];
if ([CLLocationManager locationServicesEnabled]) {
// self.locationmanager = [[CLLocationManager alloc]init];
[self.locationmanager requestAlwaysAuthorization];
[self.locationmanager requestWhenInUseAuthorization];
//设置寻址精度
self.locationmanager.desiredAccuracy = kCLLocationAccuracyKilometer; //kCLLocationAccuracyBest;
self.locationmanager.distanceFilter = 500.0; // 设定distanceFilter可以在用户移动指定的距离后,触发更新事件(500米更新一次)
[self.locationmanager startUpdatingLocation];
} else {
if (self.location_Latitude_Longitude_Block) {
self.location_Latitude_Longitude_Block(NO, 0, 0);
}
}
}
#pragma mark 定位成功后则执行此代理方法
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
{
// locations提供了一连串的用户定位,我们只需要获取最后一个就好了(当前定位)
CLLocation *currentLocation = [locations lastObject];
CLGeocoder *geoCoder = [[CLGeocoder alloc]init];
//打印当前的经度与纬度
// NSLog(@"当前经度=%f 当前纬度=%f 当前高度=%f", currentLocation.coordinate.latitude, currentLocation.coordinate.longitude, currentLocation.altitude);
//反地理编码
[geoCoder reverseGeocodeLocation:currentLocation completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
if (placemarks.count > 0) {
CLPlacemark *placeMark = placemarks[0];
NSString *currentCity = placeMark.locality;
if (!currentCity) {
currentCity = @"无法定位当前城市";
}
// 经纬度:
double latitude = [[NSString stringWithFormat:@"%lf",currentLocation.coordinate.latitude] doubleValue];
double longitude = [[NSString stringWithFormat:@"%lf",currentLocation.coordinate.longitude] doubleValue];
// NSLog(@"经度 = %f,\n 纬度 = %f", longitude, latitude);
NSDictionary *locationCurrent_longitude_latitude = @{
@"longitude":[NSString stringWithFormat:@"%f", longitude],
@"latitude":[NSString stringWithFormat:@"%f", latitude]
};
// 将当前经纬度保存在本地
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:locationCurrent_longitude_latitude forKey:@"LocationCurrent_longitude_latitude"];
[userDefaults synchronize];
/*
if (self.location_Latitude_Longitude_Block) {
self.location_Latitude_Longitude_Block(YES, latitude, longitude);
}
*/
GWLocationModel * currLocationModel = [[GWLocationModel alloc]init];
currLocationModel.currlat = latitude;
currLocationModel.currlon = longitude;
[GWLocationContext sharedLocationModelInfoContext].locationModel= currLocationModel;
[GWLocationUtilities SetCurrLocationMethod:currLocationModel];
}
}];
// 停止位置更新
[manager stopUpdatingLocation];
}
#pragma mark CoreLocation delegate (定位失败)
//定位失败后调用此代理方法
-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
if (error.code == kCLErrorDenied) {
//访问被拒绝
NSLog(@"位置访问被拒绝");
} else if (error.code == kCLErrorLocationUnknown) {
NSLog(@"无法获取用户信息");
}
}
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
if(status == kCLAuthorizationStatusNotDetermined)
{
//未决定,继续请求授权
// [self gainCurrentLoaction_latitudeAndLongitude];
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"允许定位"
message:@"请在设置中打开定位"
delegate:self
cancelButtonTitle:@"取消"
otherButtonTitles:@"确定",nil];
[alertView show];
}
else if(status == kCLAuthorizationStatusRestricted)
{
//受限制,尝试提示然后进入设置页面进行处理(根据API说明一般不会返回该值)
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"允许定位"
message:@"请在设置中打开定位"
delegate:self
cancelButtonTitle:@"取消"
otherButtonTitles:@"确定",nil];
[alertView show];
}
else if(status == kCLAuthorizationStatusDenied)
{
//拒绝使用,提示是否进入设置页面进行修改
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"允许定位"
message:@"请在设置中打开定位"
delegate:self
cancelButtonTitle:@"取消"
otherButtonTitles:@"确定",nil];
[alertView show];
}
else if(status == kCLAuthorizationStatusAuthorizedWhenInUse)
{
//授权使用,不做处理
}
else if(status == kCLAuthorizationStatusAuthorizedAlways)
{
//始终使用,不做处理
}
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
if (buttonIndex == 0) {
NSLog(@"点击了取消按钮");
if (self.location_Latitude_Longitude_Block) {
self.location_Latitude_Longitude_Block(NO, 0, 0);
}
}
else {
NSLog(@"点击了确定按钮");
if (self.location_Latitude_Longitude_Block) {
self.location_Latitude_Longitude_Block(NO, 0, 0);
}
NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
}
}
/// 没开启 定位权限时,设置权限
- (void)goToSettingLocationWithView:(UIView *)currentView {
UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:@"允许定位" message:@"请在设置中打开定位" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *ensure = [UIAlertAction actionWithTitle:@"打开定位" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
}];
UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];
[alertVC addAction:ensure];
[alertVC addAction:cancel];
[[LCM_Tool returnParentViewControllerWithView:currentView].navigationController presentViewController:alertVC animated:YES completion:nil];
}
网友评论