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 已启用
问题很可能与您为延期选择的距离和时间间隔有关。尝试利用CLLocationDistanceMax
和CLTimeIntervalMax
对函数调用进行故障排除。例如,将距离设置为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:未处理的内部错误