CLError.DeferredFailed 错误 (kCLErrorDomain Code=11) 延迟 GPS 更新失败

Posted

技术标签:

【中文标题】CLError.DeferredFailed 错误 (kCLErrorDomain Code=11) 延迟 GPS 更新失败【英文标题】:CLError.DeferredFailed Error (kCLErrorDomain Code=11) Deferred GPS Updates Failing 【发布时间】: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 10 ***.com/questions/39498899/… 我发现这个正在寻找 iOS 10 ***.com/questions/39498899/… 【参考方案1】:

iOS 9.2、Xcode 7.2、ARC 已启用

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

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

    去掉 if 语句中的 CLLocationManager.deferredLocationUpdatesAvailable() == true 条件以允许延迟位置更新。 延迟更新可用iOS6.0+,大部分iPhone 4S可以根据硬件更新到iOS7.2.1。您无需单独致电_locationManager.startUpdatingLocation()。 如果您在 iOS9.0+ 中进行测试,请确保您已为位置管理器设置了 allowsBackgroundLocationUpdates。 确保初始 _locationManager.startUpdatingLocation() 是在 Swift 中等效的 - (void)applicationWillResignActive:(UIApplication *)application 方法中创建的,而不是在 - (void)applicationDidEnterBackground:(UIApplication *)application 方法中创建的。 确保您调用的 _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

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

【讨论】:

以上是关于CLError.DeferredFailed 错误 (kCLErrorDomain Code=11) 延迟 GPS 更新失败的主要内容,如果未能解决你的问题,请参考以下文章

Pig 安装错误:错误 pig.Main:错误 2998:未处理的内部错误

Informix 错误:发生了语法错误。错误代码:-201

我收到一个错误:“MetaMask - RPC 错误:错误:错误:[ethjs-rpc] rpc 错误与有效负载”

错误精灵错误跟踪器错误

网页打开显示错误500是啥意思

PHP错误处理