如何使用iOS 6中的延迟定位功能?

5

我试图使用新的iOS 6延迟位置更新功能,但一直收到以下错误:

didFinishDeferredUpdatesWithError:错误域=kCLErrorDomain Code=11 "无法完成操作。(kCLErrorDomain错误11。)"

我正在使用以下代码:

- (DeviceAPI *) init
    {
     locationManager = [[CLLocationManager alloc] init];
     [locationManager setDelegate:self];
     [locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
     [locationManager startUpdatingLocation];
     [locationManager allowDeferredLocationUpdatesUntilTraveled:(CLLocationDistance)100000     timeout:(NSTimeInterval)100000];

    return self;
 }

同时,这个回调函数

- (void)locationManager:    (CLLocationManager *)   manager
                        didFinishDeferredUpdatesWithError:(NSError *)error
{
    NSLog(@"didFinishDeferredUpdatesWithError :%@", [error description]);
}

需要帮忙吗?


kCLErrorDomain 的错误代码11是 kCLErrorDeferredFailed。请参阅此处的文档。 - Pang
我在寻找iOS 10时发现了这个网址:https://dev59.com/h5rga4cB1Zd3GeqPrsM- - Mc Gz
5个回答

8
根据iOS 6.0 SDK的苹果开发者论坛,推迟位置更新仅适用于以下情况:
  • 使用iPhone 5硬件
  • 运行iOS 6.0或更高版本
  • 期望精度设置为kCLLocationAccuracyBestkCLLocationAccuracyBestForNavigation,因为这需要GPS芯片。没有蜂窝数据的iPad没有GPS芯片。
  • 调用“startUpdatingLocation”方法
  • 等待位置更新,大约每秒钟1个
  • 然后开始推迟更新

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

请参阅文档:allowDeferredLocationUpdates(untilTraveled:timeout:)

因此听起来您需要iPhone 5硬件,并等待每秒钟1次位置更新。

此外,正如另一位发帖者提到的那样,您需要在委托中实现locationManager:didUpdateLocations:方法。
最常调用allowDeferredLocationUpdates方法的地方是在委托的locationManager(_:didUpdateLocations:)方法中。在处理任何新位置后,如果您想推迟将来的更新直到满足距离或时间标准,请调用此方法。如果新事件到达并且您的应用程序处于后台,则缓存这些事件并适当地推迟它们的传递。
来源于docs。我已经在[]内添加了注释。

0
在我的测试中,我发现延迟更新仅适用于iOS 6.0.1或更高版本,而不适用于6.0。我在两部手机上进行了测试,一部我更新了,另一部我保留了6.0以进行测试。我相信这就是模拟器不起作用的原因,如果您的手机尚未更新,则很可能也是原因之一。
此外,请确保您实现
- locationManager:didUpdateLocations:
而不是现在已弃用的
- locationManager:didUpdateToLocation:fromLocation:
因为它是使用延迟位置更新所必需的。

0

在调用allowDeferredLocationUpdatesUntilTraveled:timeout:之前,将距离过滤器设置为kCLDistanceFilterNone,然后它就会起作用。


0

你在 info.plist 的 UIBackgroundModes 字段中设置了位置吗?


是的,我有...我还发现[CLLocationManager deferredLocationUpdatesAvailable]返回FALSE。这在ios6模拟器和iPhone 4 IOS6设备上都发生了。有什么想法吗? - user1762103

-1
我在一个框架示例中发现了这个关于 [CLRegion initCircularRegionWithCenter] 调用的描述:
“如果覆盖层的半径太大,注册将自动失败,因此将半径夹紧到最大值。”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接