CoreLocation 管理器不更新位置

Posted

技术标签:

【中文标题】CoreLocation 管理器不更新位置【英文标题】:CoreLocation manager not updating locations 【发布时间】:2013-02-13 16:33:38 【问题描述】:

我试图实现一个单独的类来管理我的位置。我想在单击按钮时获取我的位置。

gpsFilter.h

#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>

@interface gpsFilter : NSObject <CLLocationManagerDelegate>

@property (nonatomic, retain) CLLocationManager *gpsManager;
@property (nonatomic, retain) NSString * latitude;
@property (nonatomic, retain) NSString * longitude;
@end

gpsFilter.m.

#import "gpsFilter.h"

@implementation gpsFilter

- (id) init
self = [super init];
if(self != nil)
    self.gpsManager = [[CLLocationManager alloc] init];
    self.gpsManager.delegate = self;
    [self.gpsManager startUpdatingLocation];
    BOOL enable = [CLLocationManager locationServicesEnabled];
    NSLog(@"%@", enable? @"Enabled" : @"Not Enabled");

return self;


- (void)gpsManager:(CLLocationManager *) manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
NSLog(@"didUpdateToLocation: %@", newLocation);
CLLocation *currentLocation = newLocation;
if(currentLocation != nil)
    self.latitude = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.longitude];
    self.longitude = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.latitude];



- (void)gpsManager:(CLLocationManager *)manager didFailWithError:(NSError *)error

NSLog(@"didFailWithError: %@", error);

@end

我正在使用一个单独的类,因为我想在将来添加平滑过滤器。我没有得到任何更新。 NSLog 永远不会被触发。我认为某些变量正在自动释放,但我不确定是哪一个。

viewController代码如下。

#import "gpstestViewController.h"

@interface gpstestViewController ()



@end

@implementation gpstestViewController


- (void)viewDidLoad
 
[super viewDidLoad];
self.location = [[gpsFilter alloc] init];
// Do any additional setup after loading the view, typically from a nib.



- (IBAction)getloca:(id)sender 
self.latitudeLabel.text = [self.location latitude];
self.longitudeLabel.text = [self.location longitude];



- (IBAction)getLocation:(id)sender 
self.latitudeLabel.text = [self.location latitude];
self.longitudeLabel.text = [self.location longitude];


@end

很抱歉,我倾倒了很多代码,但我是 ios 编程的新手,我无法找到问题所在。

编辑:根本没有调用 updateLocation 委托方法。

【问题讨论】:

投了赞成票,因为原因有点隐蔽,你现在有足够的声望来为正确的答案投赞成票。 【参考方案1】:

委托方法必须命名为locationManager:didUpdateToLocation:fromLocation:locationManager:didFailWithError:

您不能使用自定义方法名称,例如 gpsManager:didUpdateToLocation:fromLocation:

另请注意,locationManager:didUpdateToLocation:fromLocation: 自 iOS 6 起已弃用,您应使用 locationManager:didUpdateLocations:

【讨论】:

【参考方案2】:

您的 didUpdateToLocation 的签名错误: 这是我的代码:

/** Delegate method from the CLLocationManagerDelegate protocol. */
- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation 
           fromLocation:(CLLocation *)oldLocation    

  // here do 

进一步将desiredAccuracy 设置为CLLocationAccuracyBest

【讨论】:

我在 Xcode 上模拟它。所以这似乎不是问题 我设置了它,但它不起作用。根本没有调用更新方法。 updateLocation 中的 NSLog 消息没有被打印出来。

以上是关于CoreLocation 管理器不更新位置的主要内容,如果未能解决你的问题,请参考以下文章

CoreLocation - 使用authorizedWhenInUse 授权在后台持续更新位置

如何轮询 CoreLocation 而不是获取更新?

Android 位置管理器不起作用

比一直使用 CoreLocation 获得准确位置的更好方法?

使用 CoreLocation CLLocationManager 获取过去的位置

如果 gps 打开,位置管理器不起作用。如果 gps 打开,它工作正常