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]不正确,尽管文档承诺它将在向委托发送消息之前更新。