5

目前,正在开发一个需要从 CLLocationManager 获取最后位置的应用程序(没有任何定期跟踪)。不管多少岁,它是准确的。我不需要也不想开始跟踪——我只需要从缓存中获取最后一个位置就可以了。恕我直言,CLLocationManager 是 iOS 中的共享组件,如果某个应用程序使用位置跟踪,那么另一个应用程序应该能够使用 CLLocationManager.location 中的最新位置。只需分配/初始化 CLLocationManager 并获取其位置就足够了。然而事实并非如此。我已经在 iPhone4 上进行了测试 - 启动了谷歌地图,看到了我当前的位置,然后转到了我的应用程序,但是在 [[CLLocationManager alloc] init] 位置属性之后为 nil。

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

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

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

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

2 回答 2

2

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

如果是这样,你就完成了。

如果没有,你应该startUpdatingLocation然后在didUpdateToLocation:fromLocation:回调中,stopUpdatingLocation一旦你得到位置。

我的经验表明,这是只获得一个位置的最佳方式。

更新以匹配作者更新:

你不应该stopUpdatingLocation只是在startUpdatingLocation. startUpdatingLocation在后台启动服务,所以你应该等到你得到一个位置,所以在回调方法中调用它。

于 2012-05-24T10:04:33.890 回答
1

To make any use of CLLocationManager you need to implement CLLocationManagerDelegate somewhere.

-[CLLocationManager startUpdatingLocation] starts an async process. If you stop it in the same runloop cycle the process never gets started and that is the reason you never see the permission dialog.

It goes something like this:

@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
于 2012-05-24T10:59:31.903 回答