【问题标题】:Issue with deferred location updates ios延迟位置更新 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 iphone


【解决方案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 我相信你从stackoverflow.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。
    猜你喜欢
    • 2014-06-14
    • 1970-01-01
    • 2015-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多