2015-10-02 49 views
3

我有一個應用程序,它執行定期位置更新以映射用戶路徑。CLError.DeferredFailed錯誤(kCLErrorDomain代碼= 11)延期GPS更新失敗

我正在使用延遲更新。

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個按鍵具有背景模式開啓,遠程Notifcations和位置更新。

將地圖設置爲使用自行車和行人。

將手機上的所有權限設置爲yes。

您是否知道我的應用程序轉到後臺時爲什麼我的延期更新失敗的其他原因?

它從來沒有工作,蘋果文檔小於有用

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 
} 
+0

我發現這個尋找iOS 10 http://stackoverflow.com/questions/39498899/deferredlocationupdatesavailable-returns-no-in-ios-10 –

+0

我發現這個尋找iOS 10 http://stackoverflow.com/questions/39498899/deferredlocationupdatesavailable-returns-no-in-ios-10 –

回答

3

的iOS 9.2時,Xcode 7.2,ARC啓用

該問題最有可能與你選擇你推遲的距離和時間間隔有關。嘗試利用CLLocationDistanceMaxCLTimeIntervalMax排除函數調用的故障。例如,將距離設置爲CLLocationDistanceMax,然後更改時間間隔,然後反之亦然。

但也有其他的東西我看,你可能想改變...

  1. 擺脫在CLLocationManager.deferredLocationUpdatesAvailable() == true條件if語句,允許延期定位更新。
  2. 推遲更新可用iOS6.0 +,大多數iPhone 4S可以根據硬件更新到iOS7.2.1。您無需分別撥打_locationManager.startUpdatingLocation()
  3. 請確保如果您在iOS9.0 +中測試,您已爲位置管理器設置了allowsBackgroundLocationUpdates
  4. 確保最初的_locationManager.startUpdatingLocation()是在- (void)applicationWillResignActive:(UIApplication *)application方法中以Swift等價的方法制作,而不是在- (void)applicationDidEnterBackground:(UIApplication *)application方法中製作。
  5. 請確保您以相當於Swift的- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations方法呼叫_locationManager.allowDeferredLocationUpdatesUntilTraveled(C_GPS.ACTIVITY_UPDATE_DISTANCE, timeout: C_GPS.ACTIVITY_UPDATE_TIME)

此外,請注意,在檢查錯誤是否存在之前打印錯誤,這可能會導致一些不正確的錯誤報告。

希望這會有所幫助,我也不晚!乾杯。

P.S.如果這不起作用,那麼請張貼更多的代碼,即您要將這些功能與應用程序相關聯的位置。委託* .m文件。

+0

這根本不算太晚。下週我會回到這個問題。謝謝你的回覆,這將有很大的幫助。我會深入研究並在找到答案時回覆。謝謝! – Aggressor

+0

@Aggressor,聽起來不錯!我希望這對你更好。我剛剛完成了我的一個應用程序的位置延遲計劃的完成,等待App Store進行審查。讓我知道,如果我可以得到進一步的援助。 –

1

錯誤是誤導。問題是4S不支持後臺更新。因此,對於4S,我手動refereshing更新,像這樣:

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這意味着我被推遲更新時推遲已經允許的。這似乎會導致上述錯誤。

所以,如果你得到這個錯誤,檢查你是不是allowDeferredLocationUpdatesUntilTraveleddeferredUpdates已經活躍!

+0

很好找!我必須檢查我的代碼,看看我是否錯過了我的任何應用程序。很高興你能找到錯誤。是的,我總是在你選擇的延期方法和每個策略之間取得平衡。 –

0

如果您的精度和距離過濾器設置不正確,您可能會遇到延遲更新的問題。假設你的設備支持延遲更新(CLLocationManager.deferredLocationUpdatesAvailable),你必須設置你的位置,經理第一以下幾點:

desiredAccuracy = kCLLocationAccuracyBest 
distanceFilter = kCLDistanceFilterNone 

然後就可以開始外景經理,並允許延遲更新。

相關問題