目前,开发一个需要从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
答案 0 :(得分:2)
首先,您应该检查您的locationManager
是否有预先保存的“静态”位置。
如果确实如此,那就完成了。
如果没有,您应该startUpdatingLocation
,然后在didUpdateToLocation:fromLocation:
回调中,stopUpdatingLocation
获得该位置后。
我的经验表明,这是获得一个地点的最佳方式。
更新作者更新:
stopUpdatingLocation
之后你不应该startUpdatingLocation
。 startUpdatingLocation
在后台启动服务,因此您应该等到获得位置,然后在回调方法中对其进行调用。
答案 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