【问题标题】:deferredLocationUpdatesAvailable returns NO in iOS 10deferredLocationUpdatesAvailable 在 iOS 10 中返回 NO
【发布时间】:2017-01-22 18:13:13
【问题描述】:

我正在尝试使用一些 CoreLocation 功能,但我遇到了延迟位置更新的问题。

由于某些原因,当针对 iOS 10 更新应用程序时,deferredLocationUpdatesAvailable 总是返回 NO。我在 iPhone 6s 上进行测试,所以我知道该设备能够使用 GPS 功能。

我尝试用它来调试:

[CLLocationManager deferredLocationUpdatesAvailable]

我不知道这是 iOS 10 的问题,还是我的某些设置不正确。

在这个方法中:

- (void)locationManager:(CLLocationManager *)manager didFinishDeferredUpdatesWithError:(NSError *)error {
    self.deferringUpdates = NO;
    NSLog(@"DEFERRING Error: [%@]", error);
    if (error) {
        [[LocationManagerClient alertWithMessage:error.localizedDescription andTitle:error.domain] show];
    }
}

我最终记录了这个错误:

DEFERRING Error: [Error Domain=kCLErrorDomain Code=11 "(null)"]

有没有其他人在 iOS 10 上遇到过这个问题或者知道发生了什么?

编辑: 这就是我设置距离过滤器的方式

- (void)configureForApplicationWillResignActive {
    [_locationManager setAllowsBackgroundLocationUpdates:YES];
    [_locationManager setPausesLocationUpdatesAutomatically:NO];
    [_locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
    [_locationManager setDistanceFilter:kCLDistanceFilterNone];   // use distance filter
    [_locationManager requestAlwaysAuthorization];
}

- (void)configureForApplicationDidBecomeActive {
    [_locationManager setAllowsBackgroundLocationUpdates:YES];
    [_locationManager setPausesLocationUpdatesAutomatically:NO];
    [_locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
    [_locationManager setDistanceFilter:kCLDistanceFilterNone];   // use distance filter
    [_locationManager requestAlwaysAuthorization];
}

【问题讨论】:

  • 您是否设置了除 0 以外的距离过滤器?这将导致错误 11。你能说明你是如何初始化你的 CLLocationManager 的吗?
  • 已编辑以获取更多详细信息。
  • 我们遇到了完全相同的问题,在我们的 iPhone 6s 和 6 设备上的 iOS 10 上调用 [CLLocationManager deferredLocationUpdatesAvailable] 总是返回 NO。激活延迟位置更新会导致 kCLErrorDomain Code=11
  • 对我来说同样的问题,iPhone 6S 和 10.0.2。非常令人沮丧,因为我花了很多天来正确获得延迟更新。您是否将其报告为错误?
  • 我们在我们的应用程序中看到了同样的问题,deferredLocationUpdatesAvailable() 在 iOS 10.0.2 下总是返回 false 并且激活延迟位置会导致使用 kCLErrorDeferredFailed 调用 didFinishDeferredUpdatesWithError - 我提交了一个雷达:openradar.appspot.com/radar?id=4927958787555328

标签: ios objective-c core-location


【解决方案1】:

我已经提交了带有概念证明sample code 的雷达 (28303779) - 还包含雷达的措辞。我还开了一个dev forum post,看来很多工程师都面临同样的问题。 deferredLocationUpdatesAvailable() 在 iOS 10 中也返回 false。似乎苹果故意关闭了该功能。

更新

我的错误报告已关闭,说“它按预期工作”。我想 Apple 不打算修复它,并且它被错误地取出而没有先弃用。

【讨论】:

  • 我还提交了 Radar,我的错误报告也因来自 Apple 的相同消息而关闭。这令人沮丧。
  • @erik 我感觉到你了。已经在研究 DLU 的替代实现了 :(
【解决方案2】:

延迟更新现已正式弃用(在 iOS 13 中)。这实际上是在承认他们已经好几年没有得到支持了。

【讨论】:

    【解决方案3】:

    我看起来这是 iOS 10 中的一个错误

    我们都应该提交雷达来修复它,请欺骗我的:openradar.appspot.com/radar?id=4927958787555328

    【讨论】:

    • 我的错误报告已关闭,说“它按预期工作”。我想 Apple 不打算修复它,并且它被错误地取出而没有先弃用。
    • 我的被标记为 28561857 的副本并将被关闭 - 太糟糕了,没有关于 28561857 的信息可用:/
    • 现在对我来说也一样:我自己的报告已关闭,但标记为 28561857 的副本,但它本身仍处于打开状态。我想知道当他们关闭 28561857 时是否还会向我们转发任何推理。我几乎无法相信他们故意完全删除了该功能而没有先弃用它或至少在任何类型的发行说明中提及它。
    • 是的,特别是因为看起来 Apple 非常关心能源效率,并且延迟位置更新是一个很棒的功能
    • 它既没有在 iOS 10.1.1 中修复,也没有关闭原始错误报告 - 在我自己的(已关闭)错误报告中仍然显示“28561857 重复(打开)”。
    【解决方案4】:

    这似乎是一个“错误”。 (转载于 iOS11 和 iOS12、iPhone 7、iPad mini 4 蜂窝网络)

    CLLocationManager.deferredLocationUpdatesAvailable() 始终返回 false,因此延迟更新的代码永远不会运行。但是,当应用在后台并且位置管理器通过 locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) 传递位置时,这些位置会延迟,就像启用了延迟模式一样。

    我认为延迟 API 只是出于与旧应用的兼容性原因,而新应用根本不需要担心。

    【讨论】:

    • 您在哪个 iOS 版本上测试过?我将iPhone SEiOS 12.3.1 一起使用,似乎deferredLocationUpdatesAvailable() 正在返回false。
    • 在 iOS11 和 iOS12 上测试。我现在没有使用延迟更新,坦率地说我不会错过它们。
    猜你喜欢
    • 2018-11-12
    • 2018-03-08
    • 1970-01-01
    • 2012-08-03
    • 2017-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-26
    相关资源
    最近更新 更多