iOS CoreLocation

本文介绍了一个用于iOS设备的定位服务实现方案,通过MyCoreLocation类管理定位请求,使用CLLocationManager进行位置更新,并处理用户授权状态。同时,文章详细展示了如何在用户拒绝授权时提示用户并引导其前往设置页面开启定位服务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//

//  MyCoreLocation.h

//  bameng

//

//  Created by lhb on 16/11/11.

//  Copyright © 2016年 HT. All rights reserved.

//

#import <Foundation/Foundation.h>

#import "CMNetWorkHeader.h"

@protocol MyCoreLocationDelegate <NSObject>

@end

@interface MyCoreLocation : NSObject

+(instancetype)MyCoreLocationShare;

- (void)MyCoreLocationStartLocal:(UIViewController *)vc;

- (void)MyCoreLocationStopLocal;

@property(nonatomic,weak) id <MyCoreLocationDelegate> delegate;

//0、 表示不强制   1、强制

@property(nonatomic,assign) int forceOpenLocal;

@end

//

//  MyCoreLocation.m

//  bameng

//

//  Created by lhb on 16/11/11.

//  Copyright © 2016年 HT. All rights reserved.

//

 

#import "MyCoreLocation.h"

#import <CoreLocation/CoreLocation.h>

@interface MyCoreLocation ()<CLLocationManagerDelegate>

/**

 * 定位管理器

 **/

@property (nonatomic, strong) CLLocationManager * locationManager;

/**

 * 地理编码

 **/

@property (nonatomic, strong) CLGeocoder *geoC;

 

 

@end

 

@implementation MyCoreLocation

 

static MyCoreLocation * _CoreLocationinstance;

 

 

- (CLGeocoder *)geoC{

    if (_geoC == nil) {

        _geoC = [[CLGeocoder alloc] init];

    }

    return _geoC;

}

 

- (CLLocationManager *)locationManager{

    if(_locationManager == nil){

        _locationManager = [[CLLocationManager alloc] init];

        _locationManager.delegate = self;

        _locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;

        _locationManager.distanceFilter = 100.0;

        [_locationManager requestWhenInUseAuthorization];

    }

    return _locationManager;

}

 

 

 

+(instancetype)MyCoreLocationShare{

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        if(_CoreLocationinstance == nil){

            _CoreLocationinstance = [[self alloc] init];

        }

    });

    return _CoreLocationinstance;

}

 

 

- (instancetype)init{

    if (self = [super init]) {

        [self locationManager];

    }

    return self;

}

 

 

- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status{

 

    if (status == kCLAuthorizationStatusAuthorizedWhenInUse) {

        NSLog(@"用户授权成功");

    }else if(status == kCLAuthorizationStatusDenied || status == kCLAuthorizationStatusRestricted){

        NSLog(@"用户授权失败");

        [self doDeniey];

    }

}

 

 

- (void)doDeniey{

    if (self.forceOpenLocal) {

        UIViewController * vc = [LWTool getCurrentVC];

        if (vc.navigationController.viewControllers.count > 1) {

            [vc.navigationController popViewControllerAnimated:YES];

        }

    }

}

 

- (void)locationManager:(CLLocationManager * )manager didUpdateLocations:(NSArray *)locations{

    CLLocation* location = [locations lastObject];

    [[NSUserDefaults standardUserDefaults] setObject:[NSString stringWithFormat:@"%g",location.altitude] forKey:@"altitude"];

    [[NSUserDefaults standardUserDefaults] setObject:[NSString stringWithFormat:@"%g",location.coordinate.longitude] forKey:@"longitude"];

    [[NSUserDefaults standardUserDefaults] setObject:[NSString stringWithFormat:@"%g",location.coordinate.latitude] forKey:@"latitude"];

    [manager stopUpdatingLocation];

}

 

- (void)MyCoreLocationStartLocal:(UIViewController *)vc{

    if([CLLocationManager locationServicesEnabled]){

        if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined) {

           [self.locationManager requestWhenInUseAuthorization];

        }else if([CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied){

            NSDictionary *infoDic = [[NSBundle mainBundle] infoDictionary];

            NSString *appName = [infoDic objectForKey:@"CFBundleDisplayName"];

            appName = [NSString stringWithFormat:@"为了更好的体验,请到设置->隐私->定位服务中开启!【%@APP】定位服务,已便获取附近信息!",appName];

            UIAlertController * alerc = [UIAlertController alertControllerWithTitle:@"温馨提示" message:appName preferredStyle:UIAlertControllerStyleAlert];

            UIAlertAction * action1 = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {

                [self doDeniey];

            }];

            [alerc addAction:action1];

            UIAlertAction * action2 = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {

                NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];

                [[UIApplication sharedApplication] openURL:url];

            }];

            [alerc addAction:action2];

 

            [[LWTool getCurrentVC] presentViewController:alerc animated:YES completion:nil];

        }else{

            [self.locationManager startUpdatingLocation];

        }

    }

 

}

 

- (void)MyCoreLocationStopLocal{

    [_locationManager stopUpdatingLocation];

}

 

 

@end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值