【问题标题】:CLError.DeferredFailed Error (kCLErrorDomain Code=11) Deferred GPS Updates FailingCLError.DeferredFailed 错误 (kCLErrorDomain Code=11) 延迟 GPS 更新失败
【发布时间】:2015-10-02 21:49:25
【问题描述】:

我有一个应用程序会定期更新位置以映射用户路径。

我正在使用延迟更新。

if (CLLocationManager.deferredLocationUpdatesAvailable() == true && _isDeferingUpdates == false)
        {
            print("Doing refresh")
            _isDeferingUpdates = true
            _locationManager.allowDeferredLocationUpdatesUntilTraveled(C_GPS.ACTIVITY_UPDATE_DISTANCE, timeout: C_GPS.ACTIVITY_UPDATE_TIME)
        } else
        {
            print("Could not refresh")
            // iPhone 4S does not have deferring so must keep it always on
            _locationManager.startUpdatingLocation()
        }

当应用打开时,我每秒都会收到“正在刷新”的调用。

我的设置:

在我的 pList NSLocationWhenInUseUsageDescription && NSLocationAlwaysUsageDescription 上有 2 个键

为远程通知和位置更新开启后台模式。

设置地图以使用自行车和行人。

将我手机上的所有权限设置为是。

您知道当我的应用进入后台时延迟更新失败的任何其他原因吗?

它从不工作,而且苹果文档也没有什么帮助

DeferredFailed 位置管理器没有进入延迟模式 不明原因。如果 GPS 不可用,则可能会发生此错误,而不是 激活,或暂时中断。如果您收到此错误 具有 GPS 硬件的设备,解决方法是重试。

这是我的错误处理程序:

func locationManager(manager: CLLocationManager, didFinishDeferredUpdatesWithError error: NSError?)
{
    print("FINISHED BACKGROUND UPDATE with error \(error)")
    if (error != nil)
    {
        print("ERROR IS VALID as CLError")

        if (error!.code == CLError.LocationUnknown.rawValue)
        {
            print("Error: Location Unknown")
        } else if (error!.code == CLError.DeferredAccuracyTooLow.rawValue)
        {
            print("Error: Accuracy too low")
        } else if (error!.code == CLError.DeferredFailed.rawValue)
        {
            print("Error: Deferring Failed")
        } else if (error!.code == CLError.Denied.rawValue)
        {
            print("Error: Denied")
        } else
        {
            print("Error not handled")
        }

    }
    _isDeferingUpdates = false
}

【问题讨论】:

标签: ios gps mapkit core-location


【解决方案1】:

iOS 9.2、Xcode 7.2、ARC 已启用

问题很可能与您为延期选择的距离和时间间隔有关。尝试利用CLLocationDistanceMaxCLTimeIntervalMax 对函数调用进行故障排除。例如,将距离设置为CLLocationDistanceMax,然后改变时间间隔,反之亦然。

但我发现您可能想要更改其他一些内容...

  1. 去掉 if 语句中的 CLLocationManager.deferredLocationUpdatesAvailable() == true 条件以允许延迟位置更新。
  2. 延迟更新可用iOS6.0+,大部分iPhone 4S可以根据硬件更新到iOS7.2.1。您无需单独致电_locationManager.startUpdatingLocation()
  3. 如果您在 iOS9.0+ 中进行测试,请确保您已为位置管理器设置了 allowsBackgroundLocationUpdates
  4. 确保初始 _locationManager.startUpdatingLocation() 是在 Swift 中等效的 - (void)applicationWillResignActive:(UIApplication *)application 方法中创建的,而不是在 - (void)applicationDidEnterBackground:(UIApplication *)application 方法中创建的。
  5. 确保您调用的 _locationManager.allowDeferredLocationUpdatesUntilTraveled(C_GPS.ACTIVITY_UPDATE_DISTANCE, timeout: C_GPS.ACTIVITY_UPDATE_TIME) 相当于 Swift 的 - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations 方法。

另外,请注意,在检查错误是否存在之前,您正在打印错误,这可能会导致一些不正确的错误报告。

希望这会有所帮助,我还不算太晚!干杯。

附:如果这不起作用,请发布更多代码,即您在哪里调用与应用程序相关的这些函数。委托 *.m 文件。

【讨论】:

  • 这还不算太晚。我下周才回到这个问题。感谢您的回复,这将有很大帮助。当我找到它时,我会深入研究并回复答案。谢谢!
  • @Aggressor,听起来不错!我希望它对你更好。我刚刚完成了我的一个应用程序的位置延迟计划。等待 App Store 进行审核。如果我能提供进一步的帮助,请告诉我。
【解决方案2】:

该错误具有误导性。问题是4S不支持后台更新。因此,对于 4S,我手动引用更新,如下所示:

private func refreshUpdateDeferral()
{
    if (CLLocationManager.deferredLocationUpdatesAvailable() == false && _isDeferingUpdates == false)
    {
        print("Doing deferred referral refresh")

        _isDeferingUpdates = true
        _locationManager.allowDeferredLocationUpdatesUntilTraveled(C_GPS.ACTIVITY_UPDATE_DISTANCE, timeout: C_GPS.ACTIVITY_UPDATE_TIME)
    }
}

问题是我有CLLocationManager.deferredLocationUpdatesAvailable() == true,这意味着我在已经允许延迟的情况下延迟更新。这似乎导致了上面的错误。

因此,如果您收到此错误,请检查您是否不是 allowDeferredLocationUpdatesUntilTraveled,而 deferredUpdates 已经处于活动状态!

【讨论】:

  • 好发现!我必须检查我的代码,看看我是否错过了我的任何应用程序。很高兴您能够找到错误。是的,我总是在您选择哪种延迟方法之间取得平衡,并且每种策略似乎相互冲突。
【解决方案3】:

如果您的精度和距离过滤器设置不正确,您可能会遇到延迟更新的问题。假设您的设备支持延迟更新 (CLLocationManager.deferredLocationUpdatesAvailable),您必须首先将您的位置管理器设置为以下内容:

desiredAccuracy = kCLLocationAccuracyBest
distanceFilter = kCLDistanceFilterNone

然后您可以启动位置管理器并允许延迟更新。

【讨论】:

    猜你喜欢
    • 2015-03-25
    • 2013-08-06
    • 1970-01-01
    • 2021-04-15
    • 2011-08-30
    • 2015-10-29
    • 1970-01-01
    • 2019-09-21
    • 1970-01-01
    相关资源
    最近更新 更多