2

所以我問了一個關於我的代碼與didEnterRegion有關的問題,但也許我是太具體了,因此我可以請求某人澄清方法調用的區域監視的更通用的術語的順序,特別是當應用程序在後臺。didEnterRegion執行順序?

我的理解是:

  1. 應用註冊區域調用startMonitoringForRegion:
  2. 用戶點擊主頁按鈕或鎖定裝置,應用程序進入後臺。
  3. 設備位置在操作系統級別進行監視,與應用程序分開,操作系統從未啓動應用程序以確認用戶當前的位置。
  4. 當用戶跨越邊界進入該區域時,操作系統會查找哪個應用程序最初註冊了該區域並啓動該應用程序。
  5. 該應用程序在後臺啓動,但(didFinishLaunchingWithOptions:未被調用),CLLocationManager委託設置,它的didEnterRegion委託方法被調用。
  6. 在我的情況下,這會設置立即顯示的UILocalNotification(例如,如果正在使用其他應用程序,則在主屏幕上顯示標題,或者如果電話處於休眠狀態,則顯示在鎖定屏幕上)。
  7. 用戶通過在鎖定屏幕中滑動或點擊橫幅來操作通知,啓動應用程序並調用appWillEnterForeground/appWillBecomeActive,並在應用程序委託didRecieveLocalNotification:方法被調用後執行。

這是我的理解,這可能是錯誤的,因爲如果應用程序在後臺,我的UILocalNotification永遠不會被觸發。有人能澄清哪些位錯了嗎?

回答

0

經過進一步測試後,我得出結論認爲我的代碼沒有問題,實際上它似乎是蘋果區域監控實施效果差。它似乎只比監測重要的位置變化稍微好一些,而且仍然依賴於無線網絡和蜂窩塔的變化。即使在英國的一個主要城市,我發現didEnterRegion沒有被觸發,直到你進入一英里寬的區域達1000米(如果觸發的話)。這解釋了爲什麼它每次測試Xcode和強制位置時都有效。

到目前爲止唯一的解決方法是計算每次用戶位置更新時剩餘的距離,並在小於地區半徑/ 2時手動調用didEnterRegion委託方法。這應該是由蘋果代碼自動完成的,當你進入邊界10米以上時,然而我發現由於上述原因是不可靠的。

但是,由於您無法使用GPS的更高準確度獲得定期更新,而應用程序處於後臺,這只是應用程序在後臺時的問題,它根本不是一個真正的解決方案。 :o(