Wi-Fi 存取和位置的 API 行為變更

注意

針對發行前產品的部分相關資訊,在產品正式發行時可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。

重要

本主題所述的功能適用於 Windows Insider Preview發行前版本。

變更的摘要

為了更妥善地管理哪些應用程式可以存取位置,Windows 正計劃新增隱私權控制。

目前,應用程式可以檢視可在執行應用程式之裝置附近找到的Wi-Fi網路,並使用這些網路來判斷裝置的精確位置。 但接下來,提供必要基本服務集標識碼 (BSSID) 的 API 存取權將僅限於使用者設定為允許存取使用者精確位置的應用程式。 該同意使用位置服務是在 Windows 設定> Privacy 與安全性>位置中設定的。 它可以在裝置層級、用戶層級或個別應用程式層級設定。 實作此變更之後,如果使用者尚未獲得必要的同意,系統會在第一次封鎖應用程式時觸發一次性提示。

以下是系統提示字元的範例:

系統提示的範例

如果您的應用程式在 wlanapi.hWindows.Devices.WiFi 命名空間或 NetworkInformationGeolocator 中呼叫 Wi-Fi API,則本主題適用於您。 它會詳細說明如何優化應用程式的行為,以改善用戶體驗。

何時會進行變更?

這些變更一開始 會在 Windows Insider Preview 版本中進行,然後在 Windows 功能版本(商業版)中稍後進行。

  • 在 Windows Insider Preview 版本中,這些變更將在 2023 年 10 月生效。
  • 然後,您將必須等到 2024 年秋季的下列 Windows 功能版本,以測試應用程式的案例,並進行任何必要的變更。 在該日期之後,Windows 裝置會開始取得包含上述行為變更的更新。

如前所述,即使是本檔中的詳細數據,也可能在正式發行功能之前變更。

如何準備變更?

此變更會影響數個 API 介面。 此外,如我們稍候所述,某些 API 將會在特定情況下開始傳回「拒絕存取」程序代碼。 因此,建議您測試您的應用程式,以確保一旦應用程式開始接收用戶計算機上那些「拒絕存取」傳回值,所有項目都會如預期般運作。

簡言之,我們鼓勵您身為應用程式開發人員,對應用程式的程式代碼進行下列變更。 這些變更可協助使用者(必要時)將使用者的存取權授與使用者的精確位置;和 以改善用戶體驗:

  1. 除非絕對必要,否則請勿在您的應用程式中進行Wi-Fi掃描通話。
  2. 如果您使用Wi-Fi掃描進行位置用途,請使用位置 API 呼叫來取代該掃描。
  3. 控制系統提示出現的時間,讓提示與應用程式內案例一起顯示。
  4. 建置至您的應用程式提示,讓使用者知道他們需要調整 Windows 設定,才能授與存取權。

哪些 API 將受到影響?

如果應用程式呼叫下列任何 API,您的應用程式將會受到影響:

Win32 的 wlanapi.h 或 WinRT 的 Windows.Devices.WiFi 中的 Wi-Fi API

  • 如果使用者尚未同意您的應用程式精確位置存取,則應用程式第一次呼叫受影響的 API 時,如果進程是在使用者的內容和資料夾外部 C:\Windows\System32 執行,則會顯示每個應用程式系統一次性的提示。 視您的應用程式呼叫這些 API 的方式而定,提示可以在您應用程式的使用者介面中以不同方式顯示。
  • 如果使用者尚未同意精確的位置存取,則 wlanapi.h 標頭中的下列 Win32 API 會傳回ERROR_ACCESS_DENIED
  • 如果使用者尚未同意精確的位置存取,則 Windows.Devices.WiFi.WiFiAdapter.RequestAccessAsync API 會傳回 DeniedBySystem。 Windows.Devices.WiFi 命名空間 Windows.Devices.WiFi 命名空間中的其他 API 將會擲回「拒絕存取」例外狀況。
  • 這些 API 的呼叫會出現在使用中的系統匣和位置最近的活動中。

WlanRegisterNotification 也會受到影響,視您傳遞給它的自變數而定。 如果在 dwNotifSource設定WLAN_NOTIFICATION_SOURCE_MSM旗標,則需要wiFiControl裝置功能(請參閱應用程式功能宣告)。 如果未授與該功能,則函式傳回ERROR_ACCESS_DENIED。 要求WiFiControl裝置功能需要使用者同意存取位置。

Wi-Fi API 所需的動作

若要為應用程式的使用者建立更好的體驗,並確保作業順暢,您應該對應用程式的行為進行下列變更,以控制系統提示何時顯示:

  • 如果您的 app 需要知道主機裝置的位置,則應該呼叫地理位置 API,而不是使用 Wi-Fi 掃描。
  • 為了在用戶體驗的適當時間點顯示每個應用程式系統提示,您的應用程式應該呼叫 WiFiAdapter.RequestAccessAsync。 此程式必須在使用者的內容和資料夾外部 C:\Windows\System32 執行。 呼叫應該與需要Wi-Fi或位置的用戶動作一致(導致同意率高於安裝后立即提示使用者)。
  • 您的應用程式可以使用AppCapability.CheckAccess API搭配wiFiControl裝置功能來查詢其位置存取狀態 如果下列存取會觸發對話框,則 API 會傳回 AppCapabilityAccessStatus.UserPromptRequired
  • 若要在用戶變更位置同意時收到通知並據此回應,您的應用程式應該訂閱 AppCapability.AccessChanged 事件。
  • 您應該為拒絕存取的案例新增應用程式內應用程式體驗。 在該案例中,您的應用程式應該將使用者重新導向至 Windows 設定,讓使用者可以允許您的應用程式存取其精確位置。 您可以將字串 「ms-settings:privacy-location」 傳遞至 Launcher.LaunchUriAsync 方法,以執行此動作。
  • 您的應用程式應該將要求節流至合理的層級,讓位置使用圖示不會經常出現在系統匣中。

WinRT NetworkInformation.GetLanIdentifiers 方法

NetworkInformation 所需的動作

如同上述Wi-Fi API所述,您的應用程式應該要求/查詢存取、監視變更,以及引導使用者 設定

WinRT Geolocator.RequestAccessAsync 方法

  • 如果使用者尚未同意精確位置存取,則第一次呼叫 Windows.Devices.Geolocation.Geolocator.RequestAccessAsync,將會顯示一次性的個別應用程式系統提示字元。

地理位置所需的動作

若要為應用程式的使用者建立更好的體驗,並確保作業順暢,您應該對應用程式的行為進行下列變更,以控制系統提示何時顯示:

  • 為了在用戶體驗的適當時間點顯示每個應用程式系統提示,您的應用程式應該呼叫 Geolocator.RequestAccessAsync。 此程式必須在使用者的內容和資料夾外部 C:\Windows\System32 執行。 呼叫通常應該與需要精確位置的用戶動作一致(導致同意率高於安裝后立即提示使用者)。
  • 若要在用戶變更位置同意時收到通知並據此回應,您的應用程式應該訂閱 Geolocator.StatusChangedevent 事件,並從 StatusChangedEventArgs.Status 屬性擷取位置許可權狀態。
  • 您應該為拒絕存取的案例新增應用程式內應用程式體驗。 在該案例中,您的應用程式應該將使用者重新導向至 Windows 設定,讓使用者可以允許您的應用程式存取其精確位置。 您可以將字串 「ms-settings:privacy-location」 傳遞至 Launcher.LaunchUriAsync 方法,以執行此動作。

如何測試您的應用程式

  1. 使用已在 Windows 測試人員計劃中註冊的 Windows 計算機。 它應該位於 Canary 通道上,組建 25976 或更高版本。
  2. 關閉 Windows 設定> Privacy 與安全性>位置中的位置服務。
  3. 執行使用位置或Wi-Fi資訊的應用程式。
  4. 預期的結果是您會看到系統提示,提示您輸入位置同意。

如何提供意見反應

感謝您的持續支持和意見反應。 請透過意見反應中 樞應用程式提交任何錯誤報告,並在描述中指出您的應用程式或其他詳細數據。 類別為 [裝置] 和 [驅動程式>位置服務]。

意見反應中樞類別