延迟位置更新 ios 的问题

Posted

技术标签:

【中文标题】延迟位置更新 ios 的问题【英文标题】:Issue with deferred location updates ios 【发布时间】:2013-12-04 12:14:55 【问题描述】:

过去两天我一直在尝试在应用中实现延迟位置更新。 我面临的问题是

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations

即使在我调用

之后,每秒都会调用该方法
 [self.locMgr allowDeferredLocationUpdatesUntilTraveled:(CLLocationDistance)200 timeout:(NSTimeInterval)25];

方法。

虽然我不得不说

 - (void)locationManager:(CLLocationManager *)manager didFinishDeferredUpdatesWithError:(NSError *)error

在我指定的 allowDeferredLocationUpdatesUntilTraveled 方法指定的 25 秒后准确调用,错误代码 = null。

我从文档中了解到,didUpdateLocations 应该仅在 25 秒后调用。 任何帮助将不胜感激。

【问题讨论】:

我检查了几乎所有关于 ios 延迟的论坛,发现了这一点。它几乎与我面临的问题相同。 devforums.apple.com/message/903992#903992 我不认为我会得到正确的答案。以下链接似乎有帮助,devforums.apple.com/message/766429#766429 发布它,因为它可能对其他人有帮助。 【参考方案1】:

我一直在为同样的问题而苦苦挣扎,我可能已经找到了一个可以为许多人解决这个问题的答案 - 至少它解决了我的问题并让延迟更新始终为我工作。我遵循了上面列表中的所有步骤,无论我做什么,位置更新都不会延迟。我突然想到我可能正在运行其他不允许系统睡眠的应用程序,所以我杀死了多任务托盘中的所有其他应用程序。我再次运行了我的示例应用程序......它工作了!但故事并没有就此结束。稍后我再次尝试,即使在多任务处理托盘中没有运行其他应用程序,我也无法延迟定位服务。然后我突然想到我的手机上有一个名为“Moves”的应用程序,即使你手动杀死它,它也能保持自己的生命。我不完全确定当你杀死它时,Moves 是如何神奇地恢复生机的,但它确实如此(可能使用蓝牙和应用程序保存/恢复服务)。即使它还活着并跟踪您的位置,它也不会出现在多任务处理托盘中。我认为只有手动启动的应用程序才会出现在托盘中 - 如果操作系统启动一个应用程序,它不会出现在托盘中。但我离题了......通过禁止 Moves 使用定位服务,我能够让延迟定位服务在我的应用程序中始终如一地工作。当我这样做时,即使它不在多任务处理托盘中,Moves 也会抱怨。似乎如果另一个应用程序正在使用位置服务(而不是延迟),您的应用程序也不会延迟。

【讨论】:

【参考方案2】:

根据 iOS 6.0 SDK 的 Apple 开发者论坛,延迟位置更新仅可用:

在 iPhone 5 硬件上 运行 iOS 6.0 或更高版本 将所需精度设置为 kCLLocationAccuracyBest 调用“startUpdatingLocation”方法 等待大约每秒 1 次的位置更新 然后开始推迟更新

见:https://devforums.apple.com/message/751974#751974

听起来您需要 iPhone 5 硬件,并等待 1Hz 的位置更新。

【讨论】:

是的,我忘了说,我使用的是真正的 iphone 5 ,测试了 ios 6 和 7 版本,可以清楚地看到天空,并且已经处理了所有提到的点@viruss mca 我相信你从***.com/questions/12992380/…得到这个答案@ @giddyboy:当然是来自它。你能显示位置管理器的初始化吗? - (id)init self = [super init]; if(self != nil) if([CLLocationManager locationServicesEnabled]) self.locMgr = [[CLLocationManager alloc] init]; self.locMgr.delegate = self; self.locMgr.desiredAccuracy = kCLLocationAccuracyBest; [self.locMgr setDistanceFilter: kCLDistanceFilterNone]; 其他 self.locMgr = nil; 返回自我; 是这个吗? [self.locMgr setDistanceFilter: kCLDistanceFilterNone];之后尝试删除。 我试过了。位置管理器报告错误代码为 12(一个 kCLErrorDeferredDistanceFiltered 错误)。此外,我们必须将其设置为 kCLDistanceFilterNone。

以上是关于延迟位置更新 ios 的问题的主要内容,如果未能解决你的问题,请参考以下文章

iOS Collection 视图单元格更新延迟

没有uigesturerecognizer的ios触摸位置

CBPeripheralManager 延迟停止广告/位置管理器范围停止 iBeacon

CLError.DeferredFailed 错误 (kCLErrorDomain Code=11) 延迟 GPS 更新失败

博客延迟更新

在 iOS 后台更新位置