Ios 为什么不是';发送CLLocationManagerDelegate消息时,[CLLocationManager位置]是否更新?

Ios 为什么不是';发送CLLocationManagerDelegate消息时,[CLLocationManager位置]是否更新?,ios,core-location,cllocationmanager,Ios,Core Location,Cllocationmanager,当locationManager:didUpdateLocations:(或其不推荐的等效locationManager:didUpdateToLocation:fromLocation:)消息发送到CLLocationManagerDelegate)时,状态为: 当此消息传递给您的代表时,新的 位置数据也可直接从CLLocationManager获得 对象newLocation参数可能包含缓存的数据 从以前使用的位置服务。你可以使用 location对象的timestamp属性,以确定 位置数

locationManager:didUpdateLocations:
(或其不推荐的等效
locationManager:didUpdateToLocation:fromLocation:
)消息发送到
CLLocationManagerDelegate
)时,状态为:

当此消息传递给您的代表时,新的 位置数据也可直接从CLLocationManager获得 对象newLocation参数可能包含缓存的数据 从以前使用的位置服务。你可以使用 location对象的timestamp属性,以确定 位置数据为

但是,在实践中,
CLLocationManager
location
属性不会更新。为什么不呢

我创建了一个示例项目来演示这一点:

相关代码位于
JSViewController
中,下面是其中的一个片段:

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
    self.locationManager.distanceFilter = 10000.0; // 10 km
    self.locationManager.delegate = self;
    self.locationManager.purpose = @"To show you nearby hotels.";
    [self.locationManager startUpdatingLocation];

    [self.locationManager startUpdatingLocation];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(appWillEnterForeground:)
                                                 name:UIApplicationWillEnterForegroundNotification
                                               object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(appDidEnterBackground:)
                                                 name:UIApplicationDidEnterBackgroundNotification
                                               object:nil];
}

#pragma mark - CLLocationManagerDelegate

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
    NSLog(@"New location: %@", newLocation);
    NSLog(@"Old location: %@", oldLocation);
    NSLog(@"- [CLLocationManager location]: %@", manager.location);
}

//- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
//{
//    for (CLLocation *location in locations)
//    {
//        NSLog(@"Current location: %@", locations);
//    }
//    NSLog(@"- [CLLocationManager location]: %@", manager.location);
//}

#pragma mark - Notifications

- (void)appWillEnterForeground:(NSNotification *)notification
{
    [self.locationManager startUpdatingLocation];
}

- (void)appDidEnterBackground:(NSNotification *)notification
{
    [self.locationManager stopUpdatingLocation];
}

我相信这是一个错误,我已经向苹果公司提交了一份错误报告。在开放式雷达上可以找到错误报告的镜像:


如您在文档中所读,locationManagerDelegate可能会将缓存的数据传递给回调方法

这种情况实际上经常发生,因此您需要做的是对照
oldLocation
或当前时间检查
newLocation
的时间戳,看看它们是否足够不同(不同程度由您根据应用程序的需要决定)

以下是您如何根据当前时间进行检查的片段:

    if ([newLocation.timestamp timeIntervalSinceNow] < 600) // 10 minutes
if([newLocation.timestamp timeintervalncesnow]<600)//10分钟

什么意思,它没有更新?您得到的第一个值可能是缓存的值,然后您应该得到一个实际值,假设您得到的是数据。你是在设备上测试的吗?你注意到你总是打印新位置,而不是旧位置,对吗?这实际上没有任何作用,只会阻止您查看newLocation和oldLocation是否不同。我建议:可能正在调用didUpdateToLocation,但是您没有一个新的位置,只是得到了前一个位置。这可能会发生,文档中也谈到了这一点。@Carlvaezey感谢您的更正。@all:我每次都能重现这个错误。以下是复制的步骤:1。在2下载我的示例项目。在模拟器3中运行。将您的位置设置为Apple(调试->位置->苹果),然后观察控制台4。将您的位置设置为德国(调试->位置->自定义)--纬度51,经度9--然后观察控制台5。注意将位置更改为德国时的方式:newLocation=-[CLLocationManager位置]==将位置从“Apple”切换到“Germany”时观察控制台输出。newLocation正确,而[CLLocationManager location]不正确:这不是我遇到的问题。就我而言,newLocation是正确的。问题在于[CLLocationManager location]不正确,尽管文档承诺它将在向委托发送消息之前更新。