应用程序是否应启动位置跟踪以从CLLocationManager获取任何最后已知位置?

时间:2012-05-24 09:51:22

标签: iphone objective-c location cllocationmanager

目前,开发一个需要从CLLocationManager获取最后位置的应用程序(没有任何常规跟踪)。无论多大,准确无关紧要。我不需要并且想要开始跟踪 - 我只需要从缓存中获取最后一个位置就是这样。恕我直言,CLLocationManager是iOS中的共享组件,如果某个应用程序使用位置跟踪,则另一个应用程序应该能够使用CLLocationManager.location中的最新位置。只要分配/初始化CLLocationManager并获取其位置就足够了。但事实并非如此。我已经在iPhone4上测试了 - 启动谷歌地图,看到我当前的位置,然后去了我的应用程序,但是[[CLLocationManager alloc] init]之后的位置属性为零。

更新:试过[locationManager startUpdatingLocation];和[locationManager stopUpdatingLocation];但结果是一样的。我想,唯一的解决方案是开始定期跟踪吗?

UPDATE2:奇怪但是在CLLocationManager的alloc / init之后没有“应用程序想要使用位置服务”的警报。这是我的代码片段:

CLLocationManager *locationManager = [[CLLocationManager alloc] init];

[locationManager startUpdatingLocation];
[locationManager stopUpdatingLocation];
NSLog(@"%@", locationManager.location); //prints nil

2 个答案:

答案 0 :(得分:2)

首先,您应该检查您的locationManager是否有预先保存的“静态”位置。

如果确实如此,那就完成了。

如果没有,您应该startUpdatingLocation,然后在didUpdateToLocation:fromLocation:回调中,stopUpdatingLocation获得该位置后。

我的经验表明,这是获得一个地点的最佳方式。

更新作者更新:

stopUpdatingLocation之后你不应该startUpdatingLocationstartUpdatingLocation在后​​台启动服务,因此您应该等到获得位置,然后在回调方法中对其进行调用。

答案 1 :(得分:1)

要使用CLLocationManager,您需要在某处实施CLLocationManagerDelegate

-[CLLocationManager startUpdatingLocation]启动异步过程。如果你在同一个runloop循环中停止它,那么这个过程永远不会开始,这就是你永远不会看到权限对话框的原因。

它是这样的:

@interface MyClass : NSObject <CLLocationManagerDelegate> {
    CLLocationManager *manager;
    CLLocation *lastLocation;
}

@end

@implementation

- (id)init {
    self = [super init];
    if (self) {
        manager = [[CLLocationManager alloc] init];
        manager.delegate = self;
        [manager startUpdatingLocation];
    }
    return self;
}

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation;
{   
    lastLocation = newLocation;
    [manager stopUpdatingLocation];
}

// in your real implementation be sure to handle the error cases as well.
@end