Wi-Fi 存取和位置的 API 行為變更
變更的摘要
為了更妥善地管理哪些應用程式可以存取位置,Windows 正計劃新增隱私權控制。
目前,應用程式可以檢視可在執行應用程式之裝置附近找到的Wi-Fi網路,並使用這些網路來判斷裝置的精確位置。 但接下來,提供必要基本服務集標識碼 (BSSID) 的 API 存取權將僅限於使用者設定為允許存取使用者精確位置的應用程式。 該同意使用位置服務是在 Windows 設定>隱私權與安全性>位置中設定。 它可以在裝置層級、用戶層級或個別應用程式層級設定。 實作此變更之後,如果使用者尚未獲得必要的同意,系統會在第一次封鎖應用程式時觸發一次性提示。
以下是系統提示字元的範例:
如果您的應用程式在 wlanapi.h 或 Windows.Devices.WiFi 命名空間或 NetworkInformation 或 Geolocator 中呼叫 Wi-Fi API,則本主題適用於您。 它會詳細說明如何優化應用程式的行為,以改善用戶體驗。
何時會進行變更?
這些變更一開始 會在 Windows Insider Preview 版本中進行,然後在 Windows 功能版本(商業版)中稍後進行。
- 在 Windows Insider Preview 版本中,這些變更將在 2023 年 10 月生效。
- 然後,您將必須等到 2024 年秋季的下列 Windows 功能版本,以測試應用程式的案例,並進行任何必要的變更。 在該日期之後,Windows 裝置會開始取得包含上述行為變更的更新。
如前所述,即使是本檔中的詳細數據,也可能在正式發行功能之前變更。
如何準備變更?
此變更會影響數個 API 介面。 此外,如我們稍候所述,某些 API 將會在特定情況下開始傳回「拒絕存取」程序代碼。 因此,建議您測試您的應用程式,以確保一旦應用程式開始接收用戶計算機上那些「拒絕存取」傳回值,所有項目都會如預期般運作。
簡言之,我們鼓勵您身為應用程式開發人員,對應用程式的程式代碼進行下列變更。 這些變更可協助使用者(必要時)將使用者的存取權授與使用者的精確位置;和 以改善用戶體驗:
- 除非絕對必要,否則請勿在您的應用程式中進行Wi-Fi掃描通話。
- 如果您使用Wi-Fi掃描進行位置用途,請使用位置 API 呼叫來取代該掃描。
- 控制系統提示出現的時間,讓提示與應用程式內案例一起顯示。
- 建置至您的應用程式提示,讓使用者知道他們需要調整 Windows 設定 ,才能授與存取權。
哪些 API 將受到影響?
如果應用程式呼叫下列任何 API,您的應用程式將會受到影響:
- 涉及 BSSID 之 wlanapi.h 標頭中的 Win32 API。
- 中的 Windows 執行階段 (WinRT) API Windows.Devices.WiFi 命名空間。
- WinRT 方法 Windows.Networking.Connectivity.NetworkInformation.GetLanIdentifiers。
- WinRT 方法 Windows.Devices.Geolocation.Geolocator.RequestAccessAsync。
- 此外,要求 wiFiControl 裝置功能需要使用者同意存取位置。 請參閱 應用程式功能宣告。
Win32 的 wlanapi.h 或 WinRT 的 Windows.Devices.WiFi 中的 Wi-Fi API
- 如果使用者尚未同意您的應用程式精確位置存取,則應用程式第一次呼叫受影響的 API 時,如果進程是在使用者的內容和資料夾外部
C:\Windows\System32
執行,則會顯示每個應用程式系統一次性的提示。 視您的應用程式呼叫這些 API 的方式而定,提示可以在您應用程式的使用者介面中以不同方式顯示。 - 如果使用者尚未同意精確的位置存取,則 wlanapi.h 標頭中的下列 Win32 API 會傳回ERROR_ACCESS_DENIED:
- WlanGetAvailableNetworkList
- WlanGetNetworkBssList
- WlanQueryInterface (如果 OpCode 的自變數是wlan_intf_opcode_current_connection)
- WlanScan
- 如果使用者尚未同意精確的位置存取,則 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 方法
- 如果使用者尚未同意精確位置存取, 則 Windows.Networking.Connectivity.NetworkInformation.GetLanIdentifiers API 不會傳回 WLAN 相關信息。
- 此 API 的呼叫會出現在使用中的系統匣和位置最近的活動中。
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 方法,以執行此動作。
如何測試您的應用程式
- 使用已在 Windows 測試人員計劃中註冊的 Windows 計算機。 它應該位於 Canary 通道上,組建 25976 或更高版本。
- 關閉 Windows 設定>隱私權與安全性>位置中的位置服務。
- 執行使用位置或Wi-Fi資訊的應用程式。
- 預期的結果是您會看到系統提示,提示您輸入位置同意。
如何提供意見反應
感謝您的持續支持和意見反應。 請透過意見反應中 樞應用程式提交任何錯誤報告,並在描述中指出您的應用程式或其他詳細數據。 類別為 [裝置] 和 [驅動程式>位置服務]。