如何管理網路連線事件與可用性變更 (HTML)

[ 本文的目標對象是撰寫 Windows 執行階段 App 的 Windows 8.x 和 Windows Phone 8.x 開發人員。如果您正在開發適用於 Windows 10 的 App,請參閱 最新文件 ]

本主題示範如何使用 Windows.Networking.Connectivity 命名空間中的類別,來登錄以接收網路連線狀態變更的通知,以及抓取目前的狀態資訊。

我們也提供應用程式行為的建議,在網路案例中支援一致的使用者經驗。

先決條件

下列範例使用 JavaScript,並且使用網路資訊範例做為依據。 如需使用 JavaScript 建立 Windows 執行階段應用程式的一般協助,請參閱使用 JavaScript 建立您的第一個 Windows 執行階段應用程式

了解什麼是 ConnectionProfile 以及如何存取它所代表的重要資訊;如需詳細資訊,請參閱如何抓取網路連線資訊。 如需其他程式碼範例,請下載網路資訊範例

成為連線狀態變更事件的條件資格是什麼?

狀態變更事件會指出個別連線提供的可用性、類型或連線費用的變更。最新的連線應用程式經常碰到網路周遊情況,這在行動裝置的使用上很常見。 在 Windows 執行階段偵測到新的網路時,它會自動提供它做為新的連線選項。例如,如果使用者正在 3G/4G 網路上使用裝置串流處理資料,而後來到 Wi-Fi 網路的範圍內,將會出現新連線選項供應用程式使用。當然,這也表示使用者有可能移出甚至目前仍然在使用中的網路範圍。

將這些所有的可能性納入考量,在應用程式設定邏輯是很重要的,以便網路可用性發生變更時做出智慧的選擇。現有的網路連線無法順暢地自動切換到其他連線。您的應用程式需要登錄 networkstatuschanged 事件並依此進行調整。

登錄連線狀態變更事件的通知

您的應用程式在適應變更網路狀態之前,需要知道變更網路狀態發生的時間點。 下列範例程式碼示範如何為特定連線設定檔的 networkstatuschanged 登錄事件通知。

您必須編寫程式碼,在呼叫大多數非同步網路方法時處理例外狀況。此外,登錄事件通知的 Windows.Networking.Connectivity 命名空間方法或嘗試抓取 ConnectionProfile 都會擲回例外狀況。您的例外狀況處理常式可以抓取例外狀況發生原因的更詳細資訊,更清楚地了解失敗的情況並作出適當的決定。如需詳細資訊,請參閱如何處理網路應用程式中的例外狀況


// Define some variables used

// A variable to store network status change information
var internetProfileInfo = "";

// A  boolean to keep track of registration for network status change notifications
var registeredNetworkStatusNotif = false;

var networkInfo = Windows.Networking.Connectivity.NetworkInformation;

//Register for Network Status Change notifications, and display new Internet Connection Profile information on network status change
function registerForNetworkStatusChangeNotif() {

    // register for network status change notifications
    if (!registeredNetworkStatusNotif) {
        try {
            networkInfo.addEventListener("networkstatuschanged", onNetworkStatusChange);
            registeredNetworkStatusNotif = true;

            if (internetProfileInfo === "") {
                mySample.displayStatus("No network status change. ", "sample", "status");
        }
        catch (e) {
            mySample.displayError("An unexpected exception occured: " + e.name + ": " + e.message);
        }
    }
}

當網路情況改變時,您的應用程式需要取消登錄網路狀態變更通知 (如果已經登錄的話),然後為新的網路情況重新登錄通知。

//Unregister for Network Status Change notifications
function unRegisterForNetworkStatusChangeNotif() {
    try {
        networkInfo.removeEventListener("networkstatuschanged", onNetworkStatusChange);
        internetProfileInfo = "";
    }
    catch (e) {
        mySample.displayError("An unexpected exception occured: " + e.name + ": " + e.message, "sample", "error");
    }
}

抓取連線狀態變更資訊

發生狀態變更時,下列事件處理常式範例會為目前的網際網路連線設定檔抓取相關聯的 ConnectionProfile。您可以使用 ConnectionProfile 來抓取和顯示連線狀態資訊,其中包含目前連線的領域、類型以及成本,如 NetworkConnectivityLevelNetworkTypesNetworkCostType 所定義。

// Event handler for Network Status Change event
function onNetworkStatusChange(sender) {

    //network status changed
    internetProfileInfo = "Network Status Changed: \n\r";

    try {
        // get the ConnectionProfile that is currently used to connect to the Internet
        var internetProfile = networkInfo.getInternetConnectionProfile();
        if (internetProfile === null) {
            mySample.displayStatus("Not connected to Internet\n\r");
        }
        else {
            internetProfileInfo += getConnectionProfileInfo(internetProfile) + "\n\r";
            mySample.displayStatus(internetProfileInfo);
        }
        internetProfileInfo = "";
    }
    catch (e) {
            mySample.displayError("An unexpected exception occured: " + e.name + ": " + e.message, "sample", "error");
    }
}

很多種網路狀態變更會引發網路狀態變更事件。這些包括裝置是否有新的 ConnectionProfile、新的連線成本、連線層級以及其他變更。 上面的事件處理常式可以使用 NetworkStateChangeEventDetails 類別來判別發生變更的項目。

處理連線狀態變更時的建議應用程式行為

下表簡述主要連線狀態變更案例,並提供應用程式行為建議:

案例 建議的行為
因錯誤而連線中斷

只要重試網路作業就可以重新建立連線。如果這個方法失敗,請等候 networkstatuschanged 事件抓取目前的連線狀態訊息。我們建議應用程式在重試之間使用依指數增加的輪詢間隔,從 50 毫秒的值開始。

網路中斷

通知使用者連線已中斷,然後登錄並等候 networkstatuschanged 事件。

新的網路可用性

就行動裝置而言,單一裝置周遊多個公用和私人網路的案例是很常見的。 例如,使用者在回到家並連線到家裡不受限制的家用網路之前,可能先連線到行動式寬頻然後使用訊息應用程式與朋友聊天。Windows 8、Windows Server 2012 和 Windows Phone 8.1 及更新版本的預設原則會優先選擇無任何限制的網路,其次才是計量付費網路,也會先選擇較快的網路,其次才是較慢的網路。不過,應用程式建立的現有連線不會自動切換到新的網路。應用程式必須介入,因為只有應用程式可以針對是否切換到新的網路做出最佳決定。

如果視訊串流下載即將完成,就可能沒有必要切換到新網路並重新開始下載。不過,如果目前的網路會捨棄封包、太慢,或串流還需要額外的時間才能完成,則最好是切換到新網路。

如果您判斷您的應用程式案例需要切換網路,當您偵測到新網路時,請遵循這些指導方針:

1. 檢查網路成本,並在有較佳的連線出現時重試網路作業。Windows 會自動選擇無任何限制的網路,其次才是計量付費網路,也會先挑選較快的網路,其次才是較慢的網路 (如果有的話)。

2. 重試時,如果網路作業成功,請取消先前網路原來的網路作業 (如果有的話)。

網路成本變更

特別是行動網路,在使用上常有非常特殊的限制。如果您的應用程式由於使用超過 80% 的行動式寬頻數據傳輸上限、變動成本或漫遊而發生網路成本的變更,請依如何管理計量付費網路費用限制所述調整應用程式行為。

 

注意  進階開發人員也可以在重試網路作業時,選擇最佳化應用程式行為。例如,您可能要在較高速的網路上以新連線取代現有連線。在此案例中,開發人員可以使用通訊端 API (例如 StreamSocketInformation.bandwidthStatistics),判斷切換到另一個連線是否適當。

 

摘要

在這個主題中,我們檢閱如何登錄連線狀態變更通知,並使用這些通知從發生事件的 ConnectionProfile 抓取目前狀態資訊。我們也檢閱處理最常見的狀態變更狀況時建議的應用程式行為。

雖然本主題涵蓋網路可用性,但在計量付費網路連線的案例中,networkstatuschanged 事件也可以代表成本的變更以及數據傳輸方案內容。如需如何在這些狀況變更應用程式行為的最佳方法詳細資訊與指導,請參閱如何管理計量付費網路費用限制

相關主題

其他

使用 JavaScript 建立您的第一個 Windows 執行階段應用程式

如何處理網路應用程式中的例外狀況

如何管理計量付費網路費用限制

如何抓取網路介面卡和位置資訊

如何抓取網路連線資訊

如何抓取網路連線使用狀況資料

參考

ConnectionProfile

NetworkInformation

networkstatuschanged

networkStatusChangedEventHandler

Windows.Networking.Connectivity

範例

網路資訊範例

網路狀態背景範例