5

我正在尝试使用延迟位置更新的新 iOS 6 功能,但不断收到此错误:

didFinishDeferredUpdatesWithError :Error Domain=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;
 }

这个callback功能:

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

有什么帮助吗?

4

5 回答 5

8

根据 iOS 6.0 SDK 的 Apple Developer Forums,延迟位置更新仅适用于:

  • 在 iPhone 5 硬件上
  • 运行 iOS 6.0 或更高版本
  • 所需的精度设置为kCLLocationAccuracyBestkCLLocationAccuracyBestForNavigation因为这需要GPS 芯片。没有蜂窝数据的 iPad 没有 GPS 芯片。
  • 调用“startUpdatingLocation”方法
  • 等待大约每秒 1 次的位置更新
  • 然后开始推迟更新

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

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

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

此外,正如另一张海报提到的,您需要locationManager:didUpdateLocations:在您的委托中实现该方法。

调用此 [ ] 方法的最常见位置allowDeferredLocationUpdates是在您的委托的 locationManager(_:didUpdateLocations:)方法中。处理任何新位置后,如果您想推迟将来的更新,直到满足距离或时间条件,请调用此方法。如果有新事件到达并且您的应用程序在后台,则会缓存这些事件并适当延迟它们的传递。

来自文档。我在里面添加了注释[]

于 2013-01-24T19:33:53.880 回答
0

在我的测试中,我发现延迟更新仅适用于 iOS 6.0.1 或更高版本,但不适用于 6.0。我在 2 部手机上进行了测试,其中 1 部是我更新的,1 部是出于测试原因使用 6.0 离开的。我相信这就是模拟器无法运行的原因,如果您的手机尚未更新,很可能也无法运行。

还要确保你实施

– locationManager:didUpdateLocations:

而不是现在已弃用的

– locationManager:didUpdateToLocation:fromLocation:

因为它需要与延迟位置更新一起使用。

于 2012-12-28T00:30:41.177 回答
0

您是否在 info.plist UIBackgroundModes 字段中设置了位置?

于 2012-10-30T18:14:55.273 回答
0

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

于 2015-07-08T19:58:08.517 回答
-1

我在 [CLRegion initCircularRegionWithCenter] 调用的一个框架示例中找到了此描述:

“如果覆盖的半径太大,注册会自动失败,所以将半径限制在最大值。”

于 2013-05-22T20:27:00.650 回答