搜尋

首頁  >  問答  >  主體

objective-c - CLLocationManager 定位

開啟定位有兩個方法,startMonitoringSignificantLocationChanges和startUpdatingLocation這兩個方法有什麼不同嗎?

为情所困为情所困2757 天前549

全部回覆(1)我來回復

  • 漂亮男人

    漂亮男人2017-05-02 09:27:35

    1、實現後台定位有2種方式:
    standard location service(調用CLLocationManager的startUpdatingLocation)
    significant-change location service(調用CLLocationManager 的startMonitoringSignificantLocationChanges)
    2、兩者區別要在背景使用必須在info.plist檔案中增加Required background modes屬性,並選擇App registers for location updates值。
    前者(startUpdatingLocation)在後台運行時可能會因為資源問題被系統掛起(suspend)或終止(terminate),但一旦有更新會被喚起,但是當更新時系統任然資源緊張,則會被延遲調用委託。如果對於即時性要求高的可能不適合這個,很難控制使用者機器效能狀況。
    前者(startUpdatingLocation)如果被使用者手動關閉,就不會再被喚醒。
    前者定位是基於gps/基地台/wifi定位,具體使用哪一種CoreLocation框架有一套自己的規則。
    後者(startMonitoringSignificantLocationChanges)是使用基地台定位的,所以設備一定要有電話模組,在plist中可以設定xx屬性來限制可下載安裝的設備。
    後者(startMonitoringSignificantLocationChanges)不管是在背景或使用者手動關閉都會被喚醒呼叫委託,只有3種方法可以阻止它的更新。 (1)用戶關閉定位服務(2)用戶關閉對該app的定位服務(3)設備處於飛行模式或無法開啟必要的硬體(猜測是定位模組的硬體)。
    後者(startMonitoringSignificantLocationChanges)什麼時候更新呢?是在更換基地台的時候更新。所以更新頻率與基地台密度有關。市區更新頻率較郊區高。所以很多同學說沒有更新是因為還在同一組基地台範圍內。
    前者較後者耗電且精度高。
    3、兩者共性:
    兩者都更新位置資訊時都回呼相同的委託方法:-(void)locationManager:(CLLocationManager
    )manager didUpdateLocations:(NSArray )locations;4、上傳資訊:
    由於後台任務只分配了有限時間執行必要的操作,所以如果在逾時之前未完成(例如網路請求),app將會被終止。這裡有一個方法,可以申請額外的10分鐘讓你執行想要的操作,申請後台任務:beginBackgroundTaskWithExpirationHandler(不詳細說了,使用方法可以查一下資料)。
    5、總結:
    2種方式各有利弊,根據使用場景而決定,前台運行的app通常要求準確實時定位,並且運行時間有限,考慮用第一種標準定位,例如導航應用。如果移動速度快(距離變化明顯),長時間定位(監控),可以考慮後者,例如搭計程車應用。
    引用自這裡

    回覆
    0
  • 取消回覆