实用知识:CoreLocation的使用(区域监听)

本文介绍如何在iOS应用中实现地理位置区域监听功能。通过CLLocationManager设置代理并请求定位服务权限,可以监测用户是否进入或离开预设的圆形地理区域,并响应相应的事件。

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

#import "ViewController.h"
#import <CoreLocation/CoreLocation.h>

@interface ViewController () <CLLocationManagerDelegate>

@property (strong, nonatomic) CLLocationManager *manager;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    // 区域监听需要获取位置, 所以要授权
    if ([CLLocationManager locationServicesEnabled] == NO) {
        return;
    }

    if ([CLLocationManager authorizationStatus] ==  kCLAuthorizationStatusNotDetermined) {

//        [self.manager requestWhenInUseAuthorization];

        // 区域监听只能使用Always权限
        [self.manager requestAlwaysAuthorization];
    } else if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied) {

        // 友情提示用户给打开定位服务 , 文字/图片
    }

    // 监听是否到达公司上班

    // CLRegion 表示地理上的一个区域
    // CLCircularRegion 表示一个圆形区域

    // 坐标
    CLLocationCoordinate2D center = CLLocationCoordinate2DMake(37.785834, 122.406417);
    // 区域
    CLCircularRegion *region = [[CLCircularRegion alloc] initWithCenter:center radius:500 identifier:@"RegionIdentifier"];

    // 开始监听区域
    [self.manager startMonitoringForRegion:region];
}

#pragma mark - CLLocationManagerDelegate

- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
    if (status == kCLAuthorizationStatusAuthorizedAlways) {
        NSLog(@"授权成功");
    }
}

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
    switch (error.code) {
        case kCLErrorLocationUnknown:
            NSLog(@"位置未知");
            break;
        case kCLErrorDenied:
            NSLog(@"授权拒绝");
            break;
        default:
            break;
    }
}

// 进入了监听的区域后触发
- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
{
    NSLog(@"进入了监听: %@", region.identifier);

//    if (region.identifier isEqualToString:@"") {
//        
//    }
}

// 退出了监听区域后触发
- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region
{
    NSLog(@"离开了监听: %@", region.identifier);
}

#pragma mark - Getter & Setter

- (CLLocationManager *)manager
{
    if (_manager == nil) {
        _manager = [[CLLocationManager alloc] init];

        // 通过代理进行的数据回调
        _manager.delegate = self;
    }
    return _manager;
}

@end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值