為受限的衛星網路開發應用程式

衛星網路有朝一日會變得足夠強大,可做為一般網路運作,並與所有應用程式用途完美搭配。不過,目前這些網路上的資料仍是稀缺資源。對資料用量設有限制的衛星網路稱為「受限衛星網路」。

基於上述限制,Android 應用程式預設不會使用這些網路。如要讓應用程式在受限的衛星網路上運作,您必須將應用程式標示為已針對衛星數據用量進行最佳化,並調整應用程式的用途,以便在連線至受限的衛星網路時節省資源。

調整應用程式的用途

只要選擇加入,應用程式就能存取受限的衛星網路,但您可能需要進一步調整,最佳化應用程式行為,以負責任的方式使用有限的網路資源。針對受限的數據用量進行最佳化時,請考量下列事項:

  • 衛星網路的運作條件比地面 LTE/5G 網路更受限,特點是處理量較低、延遲時間較長。雖然我們通常建議盡量減少資料用量,以確保可靠性,但每個應用程式都不同。您應評估特定用途,判斷目前的資料最佳化策略是否能在這些受限環境中,提供可接受的使用者體驗。
  • 判斷應用程式是否適合在受限網路中使用。有些應用程式在任何情況下都不適合用於資料受限的網路。舉例來說,高頻寬應用程式 (例如影片串流) 應評估資料壓縮和內容傳遞機制,確保使用者體驗正常。如果因資料限制而無法避免體驗降級,應用程式應採取下列行動:
    1. 應用程式可能選擇完全不使用衛星網路,但仍可辨識衛星網路是否存在,並通知使用者無法在現有的受限網路上運作。
    2. 找出要限制或修改的特定用途。應用程式的某些功能可能比其他功能更適合在資料有限的情況下使用。舉例來說,傳送簡訊等低頻寬作業的可靠性很高。不過,上傳未壓縮的 HD 高畫質影片等高頻寬作業,可能會出現明顯的緩衝或失敗情形。建議您針對這些高需求功能,導入自動調整位元率串流或強大的壓縮功能。這與許多應用程式在漫遊時變更行為的方式類似。
    3. 調整應用程式使用網路資源的方式。當應用程式以突發方式執行網路作業,且大部分時間不使用網路時,受限網路的效果最佳。延遲時間不穩定,可能會導致即時同步通訊難以進行。

如果應用程式使用複雜的網路邏輯或 Firebase 雲端通訊,您也需要進行特定變更。

自我識別為針對受限網路最佳化

如要將應用程式標示為已針對受限網路進行最佳化,並選擇使用這類網路,請使用 <meta-data> 元素更新應用程式資訊清單檔案,如下所示:

<meta-data android:name="android.telephony.PROPERTY_SATELLITE_DATA_OPTIMIZED"
          android:value="PACKAGE_NAME" />

這個元素可讓應用程式在只有受限衛星網路可用時,使用該網路。此外,這項宣告也會通知系統,您的應用程式已針對受限網路進行最佳化,並在設定應用程式中,將其列為支援衛星通訊的應用程式,方便使用者找到。

在資料受限的情況下變更行為

如果您需要在受限網路中變更應用程式的行為,或應用程式已有使用 ConnectivityManager 管理網路使用的邏輯,則需要對網路流程進行一些變更。

偵測受限資料條件

用於網路要求的 NetworkCapabilities 物件包含 NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED 位元,預設會在所有網路上設定,並在頻寬受限的網路上移除。您可以檢查網路是否具有 NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED 功能,判斷網路是否受到頻寬限制。

在受限網路中工作

NetworkRequest 物件也預設包含 NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED 功能。移除這項功能,表示可以接受受限網路。

偵測到連上受限網路時,您可以視需要調整應用程式功能:

val handlerThread = HandlerThread("SatelliteNetworkMonitor")
handlerThread.start()
val handler = Handler(handlerThread.getLooper())

// Make the network request.
val request = NetworkRequest.Builder()
    .addCapability(NET_CAPABILITY_INTERNET)
    .removeCapability(NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED)
    .build()

// Register for the callback.
val callback = object : NetworkCallback() {
    override fun onCapabilitiesChanged(net: Network, nc: NetworkCapabilities) {
        updateAppUseCases(net, nc)
    }

    fun updateAppUseCases(net: Network, nc: NetworkCapabilities) {
        // Check if the network is bandwidth-constrained or if the transport is satellite.
        // Checking for the satellite transport is to make sure that application
        // continue to have optimized behavior on satellite networks irrespective of whether
        // the NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED capability is set or not. This is
        // because the capability can be removed on an unconstraned satellite Network which only
        // means applications does not need to modify to get data access but should continue
        // to optimize for data usage.
        if (!nc.hasCapability(NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED) ||
            nc.hasTransport(NetworkCapabilities.TRANSPORT_SATELLITE)
        ) {
            // Adapt to constrained network or disable heavy data usage features.
            // ...
        } else {
            // Revert to non optimized behavior for data usage.
            // ...
        }
    }
}
// Where cm is your ConnectivityManager object:
cm.registerBestMatchingNetworkCallback(request, callback, handler)

在受限網路上接收 FCM 訊息

如果應用程式使用 Firebase 雲端通訊 (FCM) 接收來自應用程式伺服器的訊息,您可以在將訊息傳遞至 FCM 伺服器時加入 bandwidth_constrained_ok 旗標,指出即使在受限的網路上,也應傳遞特定訊息:

{
  "message":{
    "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
    "notification":{
      "title":"Portugal vs. Denmark",
      "body":"great match!"
    }
    "android": {
       "bandwidth_constrained_ok": true
    }
  }
}

如果訊息不含這個旗標,FCM 伺服器只會在裝置透過不受限網路連線時傳送訊息。