XMPP-利用CoreLocation获取地理位置以及CLLocationManager 为什么就不调用代理

本文详细介绍了如何使用CoreLocation框架在iOS应用中获取用户的地理位置,并将其应用于基于XMPP的即时通讯系统中。文中提供了从初始化CLLocationManager到实现位置更新通知的完整代码示例,同时解决了实际开发过程中可能遇到的问题。

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

最近做基于XMPP的即时通讯,把相关内容总结整理下来看看!

一.利用CoreLocation获取地理位置

利用CoreLocation,必须在frameworks里面加入"CoreLocation.framework",然后类中import <CoreLocation/CoreLocation.h>

1.定义成员变量

#import "LocationHelper.h"
@interface LocationHelper ()<CLLocationManagerDelegate>
{
    CLLocationManager *_locationManager;
}
@property(nonatomic,copy)GetLocationCompledBlock getLocationCompledBlock;

2.实现单例

#pragma mark - shareLocationHelper单例

+ (id)shareLocationHelper{
    static LocationHelper *instance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[LocationHelper alloc] init];
    });
    return instance;
}

3.进行初始化CLLocationManager位置管理器

- (void)setup {
    _locationManager = [[CLLocationManager alloc] init];
    _locationManager.delegate = self;
    _locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    _locationManager.distanceFilter = 5.0;
    [_locationManager requestAlwaysAuthorization];
}

desiredAccuracy为设置定位的精度,可以设为最优,装置会自动用最精确的方式去定位。

distanceFilter是距离过滤器,为了减少对定位装置的轮询次数,位置的改变不会每次都去通知委托,而是在移动了足够的距离时才通知委托程序,它的单位是米,这里设置为移动5再通知委托处理更新

4.实现外界要求获取位置的请求

- (void)getCurrentGeolocationsCompled:(GetLocationCompledBlock)compled{
    self.getLocationCompledBlock = compled;
    [_locationManager startUpdatingLocation];
}

在此使用startUpdatingLocation启动定位管理了,一般来说,在不需要更新定位时最好关闭它,用stopUpdatingLocation,可以节省电量。

5.实现CLLocationManagerDelegate代理方法获取位置更新信息

#pragma mark - CLLocationManager Delegate

// 代理方法实现
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
    CLGeocoder* geocoder = [[CLGeocoder alloc] init];
    
    [geocoder reverseGeocodeLocation:newLocation completionHandler:
     ^(NSArray* placemarks, NSError* error) {
         if (self.getLocationCompledBlock) {
             self.getLocationCompledBlock(placemarks);
         }
     }];
    [manager stopUpdatingLocation];
}

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
    [manager stopUpdatingLocation];
}
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
    switch (status) {
        casekCLAuthorizationStatusNotDetermined:
            if ([_locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
                [_locationManager requestAlwaysAuthorization];
            }
            break;
        default:
            break;
    } 
}

6.控制器中调用方法获取位置信息后加TAG发送

[self.locationHelper getCurrentGeolocationsCompled:^(NSArray *placemarksA) {
        CLPlacemark *placemark = [placemarksA lastObject];
        if (placemark) {
            NSDictionary *addressDictionary = placemark.addressDictionary;
            NSArray *formattedAddressLines = [addressDictionary valueForKey:@"FormattedAddressLines"];
            NSString *geoLocations = [formattedAddressLines lastObject];
            if (geoLocations) {
                //geoLocations===中国****
                [weakSelf didSendGeolocationsMessageWithGeolocaltions:geoLocations];
            }
        }
}];

 

二.CLLocationManager为什么就不调用代理

代码方法开开心心的写完了,但是在发送地理位置消息的时候老是没有消息,郁闷了,断点发现代理根本都没进,最后分析找资料得到解决

上述编码均完成后在Plist文件中添加字段NSLocationAlwaysUsageDescription

 

转载于:https://www.cnblogs.com/youmomo/p/4088509.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值