共用方式為


定位感知應用程式的指導方針

這個主題詳細介紹了需要存取使用者位置的應用程式的效能指導方針。

重要 API

建議

  • 只有在應用程式需要位置資料時,才開始使用 location 物件。

    在存取使用者的位置之前呼叫 RequestAccessAsync。 此時,您的應用程式必須在前景,且 RequestAccessAsync 必須是從 UI 執行緒呼叫。 在使用者授與您的應用程式存取其位置的權限之前,您的應用程式將無法存取位置資料。

  • 如果位置對您的應用程式而言並不重要,請等到使用者嘗試完成需要位置資訊的工作時再存取位置。 例如,如果社交網路應用程式有「使用我的位置簽到」按鈕,該應用程式應該在使用者按下按鈕之後再存取位置。 如果應用程式的主要功能有需要,可以立即存取位置。

  • 第一次使用 Geolocator 物件必須在前景應用程式的主要 UI 執行緒上進行,才能對使用者觸發程序同意提示。 Geolocator 的第一次使用可以是 getGeopositionAsync 的第一次呼叫,或是 positionChanged 事件處理常式的第一個註冊。

  • 告知使用者如何使用位置資料。

  • 提供 UI,讓使用者手動更新其位置。

  • 等候取得位置資料時,顯示進度列或進度環。

  • 停用或無法使用位置服務時,顯示適當的錯誤訊息或對話方塊。

    如果位置隱私權設定不允許您的應用程式存取使用者的位置,建議在 [設定] 應用程式中提供 [位置隱私權設定] 的便利連結。 例如,您可以使用 Hyperlink 控制項或呼叫 LaunchUriAsync 方法來使用 ms-settings:privacy-location URI 從程式碼啟動 [設定] 應用程式。 如需詳細資訊,請參閱啟動 Windows 設定應用程式

  • 清除快取的位置資料,並在使用者停用位置資訊的存取權時釋放 Geolocator

    如果使用者透過 [設定] 關閉位置資訊的存取權,請釋放 Geolocator 物件。 然後,應用程式會收到任何位置 API 呼叫 ACCESS_DENIED 結果。 如果您的應用程式儲存或快取位置資料,當使用者撤銷位置資訊的存取權時,請清除所有快取的資料。 提供替代方式,以在無法透過位置服務使用位置資料時,手動輸入位置資訊。

  • 提供重新啟用位置服務的 UI。 例如,提供重新整理按鈕,以重新具現化 Geolocator 物件,並嘗試再次取得位置資訊。

    讓您的應用程式提供重新啟用位置服務的 UI,

    • 如果使用者在停用位置存取權之後重新啟用,則不會通知應用程式。 status 屬性不會變更,而且沒有 statusChanged 事件。 您的應用程式應該建立新的 Geolocator 物件,並呼叫 getGeopositionAsync 來嘗試取得更新的位置資料,或再次訂閱 positionChanged 事件。 如果狀態接著指出位置已重新啟用,請清除應用程式先前通知使用者已停用位置服務的任何 UI,並適當地回應新的狀態。
    • 您的應用程式也應該在啟用時,或當使用者明確嘗試使用需要位置資訊的功能,或任何其他案例的適當時機,再次嘗試取得位置資料。

效能

  • 如果您的應用程式不需要接收更新位置,請使用一次性的位置要求。 例如,將位置標記新增至相片的應用程式不需要接收位置更新事件。 相反地,它應該使用 getGeopositionAsync 來要求位置,如取得目前位置中所述。

    當您提出一次性位置要求時,應該設定下列值。

    • 藉由設定 DesiredAccuracyDesiredAccuracyInMeters 來指定應用程式所要求的精確度。 如需使用這些參數的建議,請參閱下文
    • 設定 GetGeopositionAsync 的最大存留期參數,以指定多久前可以取得位置,才對您的應用程式有用。 如果您的應用程式可以使用幾秒或幾分鐘前的位置,幾乎可以立即收到位置,並有助於節省裝置電源。
    • 設定 GetGeopositionAsync 的逾時參數。 這是您的應用程式可以等候位置或傳回錯誤的時間長度。 您需要找出應用程式在對使用者回應的即時性和準確性之間取得的平衡點。
  • 在需要頻繁更新位置時,請使用連續定位工作階段。 使用 positionChangedstatusChanged 事件來偵測超過特定閾值的移動距離,或發生連續位置更新。

    要求位置更新時,您可以藉由設定 DesiredAccuracyDesiredAccuracyInMeters 來指定應用程式所要求的精確度。 您也應該使用 MovementThresholdReportInterval 來設定位置更新的需求頻率。

    • 指定移動距離閾值。 某些應用程式只有在使用者移動了大距離時,才需要位置更新。 例如,除非使用者的位置已變更為不同的城市,否則提供本機新聞或天氣更新的應用程式可能不需要位置更新。 在此情況下,您可以藉由設定 MovementThreshold 屬性來調整位置更新事件所需的最小移動距離。 這有篩選出 PositionChanged 事件的效果。 只有在位置變更距離超過移動閾值時,才會引發這些事件。

    • 使用 reportInterval 來配合您的應用程式體驗,並將系統資源的使用降到最低。 例如,天氣應用程式可能需要每隔 15 分鐘更新一次資料。 除了即時導航應用程式以外,大部分的應用程式都不需要高度精確且持續不斷的位置更新。 如果您的應用程式不需要最準確的資料流,或者更新頻率不高,請設定 ReportInterval 屬性,以指示您的應用程式所需的位置更新的最小頻率。 當需要時,位置來源可以透過計算位置來節省電力。

      需要即時資料的應用程式應將 ReportInterval 設定為 0,表示未指定最小時間間隔。 預設報告間隔為 1 秒,或者盡可能頻繁地支援硬體,以較短者為準。

      提供位置資料的裝置可能會追蹤不同應用程式要求的報告間隔,並在最小要求間隔提供資料報告。 最需要高精確度的應用程式,會因此收到所需的資料。 因此,如果另一個應用程式要求更頻繁的更新,位置提供者可能會以高於您應用程式所要求的頻率來產生更新。

      注意 位置來源並不保證會在指定的報告間隔內回應請求。 並非所有位置提供者裝置都會追蹤報告間隔,但對於那些有追蹤功能的裝置,您仍應提供報告間隔。

    • 若要協助節省電源,請設定 desiredAccuracy 屬性,以向位置平台指出您的應用程式是否需要高精確度資料。 如果沒有任何應用程式需要高精確度資料,系統就可以不開啟 GPS 提供者來節省電力。

      • desiredAccuracy 設定為 HIGH,讓 GPS 取得資料。
      • desiredAccuracy 設定為 [預設],並只使用單次呼叫模式,以將應用程式僅針對廣告目標使用位置資訊,將耗電量降到最低。

      如果您的應用程式有精確度的特定需求,您可能想要使用 DesiredAccuracyInMeters 屬性,而不是使用 DesiredAccuracy。 這在 Windows Phone 特別有用,通常可以根據行動網路信標、Wi-Fi 信標和衛星取得位置。 選擇更具體的精確度值,將有助於系統在提供位置時,以最低功耗使用正確的技術。

      例如:

      • 若您的應用程式是為了廣告調整、天氣、新聞等而取得位置資訊,5000 公尺的精確度通常已足夠。
      • 如果您的應用程式顯示附近社區的優惠,300 公尺的精確度通常足以提供結果。
      • 如果使用者在尋找附近餐廳的推薦,我們可能希望取得在街區範圍內的位置,所以 100 公尺的精確度就足夠了。
      • 如果使用者嘗試分享他的位置,應用程式應該要求約 10 公尺的精確度。
    • 如果您的應用程式有特定的精確度需求,請使用 Geocoordinate.accuracy 屬性。 例如,導航應用程式應該使用 Geocoordinate.accuracy 屬性來判斷可用的位置資料是否符合應用程式的需求。

  • 請考慮啟動延遲。 應用程式第一次要求位置資料時,位置提供者啟動時可能會有短暫的延遲 (1-2 秒)。 請在應用程式 UI 的設計中考慮這一點。 舉例來說,您可能希望避免在呼叫 GetGeopositionAsync 完成之前阻止其他工作。

  • 請考慮背景行為。 如果您的應用程式不處於正在操作的狀態,則不會在背景暫停時收到位置更新事件。 如果您的應用程式透過記錄來追蹤位置更新,請注意這一點。 當應用程式再次成為操作中的狀態時,它只會接收新的事件。 它不會取得非作用中時所發生的任何更新。

  • 有效率地使用原始感應器和融合感應器。 感應器有兩種類型:原始感應器融合感應器

    • 原始感應器包括加速計、陀螺儀和磁力計。
    • 融合感應器包括方向、傾斜計和指南針。 融合感應器會從原始感應器的組合取得其資料。

    除了磁力計之外,Windows 執行階段 API 可以存取所有這些感應器。 融合感應器比原始感應器更精確且穩定,但會使用更多的電源。 您應該針對適當的用途使用正確的感應器。 如需詳細資訊,請參閱感應器

連線待命

  • 當計算機處於連線待命狀態時, 一律可以具現化 Geolocator 物件。 不過,Geolocator 物件不會找到任何要匯總的感應器,因此對 GetGeopositionAsync 的呼叫會在 7 秒後逾時,因此永遠不會呼叫 PositionChanged 事件接聽程式,而且 StatusChanged 事件接聽程式將會使用 NoData 狀態呼叫一次。

其他用法指導方針

偵測位置設定中的變更

使用者可以使用 [設定] 應用程式中的 [位置隱私權設定] 來關閉位置功能。

  • 偵測使用者何時停用或重新啟用位置服務:
    • 處理 StatusChanged 事件。 如果使用者關閉位置服務,則 StatusChanged 事件引數的 Status 屬性具有 Disabled 值。
    • 檢查從 GetGeopositionAsync 傳回的錯誤碼。 如果使用者已停用位置服務,則呼叫 GetGeopositionAsync 時失敗,並出現 ACCESS_DENIED 錯誤,且 LocationStatus 屬性具有 Disabled 值。
  • 若您有一個需要位置資料的應用程式,例如地圖應用程式,請務必執行以下步驟:
    • 處理 PositionChanged 事件,以在使用者的位置變更時取得更新。
    • 依照先前所述處理 StatusChanged 事件,以偵測位置設定中的變更。

請注意,定位服務會在資料可用時傳回資料。 它可能會先傳回誤差半徑較大的位置,然後在資料可用時以更精確的資訊更新位置。 顯示使用者位置的應用程式通常會希望在更精確的資訊可用時更新位置。

位置的圖形表示

讓您的應用程式使用 Geocoordinate.accuracy 來清楚表示使用者在地圖上的目前位置。 精確度主要有三個級距:大約 10 公尺的誤差半徑、大約 100 公尺的誤差半徑,以及大於 1 公里的誤差半徑。 透過使用精確度資訊,可以確保應用程式在所提供的資料情境中正確顯示位置。 如需使用地圖控制項的一般資訊,請參閱使用 2D、3D 和街景檢視顯示地圖

  • 精確度約為 10 公尺 (GPS 解析度),位置可以用地圖上的一個點或標籤表示。 這樣的精確度,可以顯示經緯度座標和街道地址。

    以大約 10 公尺的 GPS 精確度顯示的地圖範例。

  • 介於 10 到 500 公尺 (約 100 公尺) 之間的精確度,通常是透過 Wi-Fi 解析度來接收位置訊號。 手機訊號取得的位置精確度約為 300 公尺。 在這種情況下,我們建議您的應用程式顯示錯誤半徑。 對於需要顯示中心點的應用程式,可以使用周圍帶有誤差半徑的點來表示。

    以大約 100 公尺的wi-fi 精確度顯示的地圖範例。

  • 如果傳回的精確度大於 1 公里,您可能是以 IP 層級的解析度接收位置資訊。 這個精確度層級通常不足以精確標定地圖上的特定位置。 您的應用程式應該在地圖上放大到城市層級,或根據誤差半徑 (例如,區域層級) 放大到適當的區域。

    以大約 1 公里的 wi-fi 精確度顯示的地圖範例。

當位置精確度從某個精確度範圍切換到另一個範圍時,應提供不同圖形表示之間的流暢轉換。 執行方式如下:

  • 將轉換動畫流暢,保持轉換快速且流暢。
  • 等候數個連續報告來確認精確度的變更,以協助防止不必要和過於頻繁的縮放。

位置的文字表示

有些應用程式,例如天氣應用程式或本地資訊應用程式,需要以文字方式在不同的精確度層級上表示位置。 請務必清楚顯示位置,僅依據資料提供的精確度層級顯示。

  • 大約相當於 10 公尺 (GPS 解析度) 的精確度,接收到的位置資料相當精確,因此可以傳達至社區名稱的層級。 您也可以使用城市名稱、州或省名稱,以及國家/地區名稱。
  • 對於大約相當於 100 公尺的精確度 (Wi-Fi 解析度),收到的位置資料相當精確,因此建議您顯示資訊至城市名稱層級。 避免使用社區名稱。
  • 對於精確度超過 1 公里 (IP 解析度),僅顯示州或省,或國家/地區名稱。

隱私權考量

使用者的地理位置是可識別個人身份資訊 (PII)。 以下網站提供了保護使用者隱私權的指引。