Sınırlı uydu ağları için geliştirme

Uydu ağları bir gün normal ağlar gibi çalışacak ve tüm uygulama kullanım alanlarıyla sorunsuz bir şekilde entegre olacak kadar güçlü olacaktır. Ancak şu anda bu ağlardaki veriler sınırlı bir kaynaktır. Veri kullanımıyla ilgili kısıtlamaları olan uydu tabanlı bir ağa kısıtlanmış uydu ağı denir.

Bu kısıtlamalar nedeniyle Android uygulamaları, varsayılan olarak bu ağları kullanmaz. Uygulamanızın sınırlı uydu ağlarında çalışmasını istiyorsanız uygulamanızı uydu verisi kullanımı için optimize edilmiş olarak tanımlamanız ve sınırlı bir uydu ağına bağlandığında kaynakları korumak için uygulamanızın kullanım alanlarını uyarlamanız gerekir.

Uygulamanızın kullanım alanlarını uyarlama

Uygulamanızın sınırlı uydu ağlarına erişmesine izin vermek için tek yapmanız gereken özelliği etkinleştirmektir. Ancak sınırlı ağ kaynaklarını sorumlu bir şekilde kullanmak için uygulamanızın davranışını optimize etmek üzere başka değişiklikler yapmanız gerekebilir. Sınırlı veri kullanımı için optimizasyon yaparken dikkat etmeniz gereken bazı noktalar aşağıda açıklanmıştır:

  • Uydu ağları, karasal LTE/5G ağlarına kıyasla çok daha kısıtlı koşullarda çalışır. Bu ağlar, daha düşük işleme hızı ve daha yüksek gecikme süresiyle karakterize edilir. Genel olarak güvenilirlik nedeniyle veri kullanımını en aza indirmenizi önersek de her uygulama benzersizdir. Mevcut veri optimizasyonu stratejilerinizin bu kısıtlı ortamlarda kabul edilebilir bir kullanıcı deneyimi sağlayıp sağlamadığını belirlemek için özel kullanım alanlarınızı değerlendirmeniz gerekir.
  • Uygulamanızın sınırlı ağlarda kullanıma uygun olup olmadığına karar verin. Bazı uygulamalar, hiçbir koşulda veri sınırlaması olan ağlar için uygun değildir. Örneğin, video akışı gibi yüksek bant genişliğine sahip uygulamalar, işlevsel bir kullanıcı deneyimi sağlamak için veri sıkıştırma ve içerik dağıtım mekanizmalarını değerlendirmelidir. Veri kısıtlamaları nedeniyle deneyimin kalitesinin düşmesi kaçınılmazsa uygulama aşağıdaki işlemleri yapmalıdır:
    1. Uygulamalar, uydu ağlarını hiç kullanmamayı tercih edebilir. Ancak yine de uydu ağının varlığını belirleyip kullanıcıyı mevcut sınırlı ağda çalışmayacakları konusunda bilgilendirebilirler.
    2. Sınırlanacak veya değiştirilecek belirli kullanım alanlarını belirleyin. Uygulamanızın bazı özellikleri, sınırlı veri koşullarına diğerlerinden daha uygun olabilir. Örneğin, kısa mesaj gönderme gibi düşük bant genişliği gerektiren işlemler son derece güvenilirdir. Ancak sıkıştırılmamış HD video yükleme gibi yüksek bant genişliği gerektiren işlemler önemli ölçüde arabelleğe alma veya başarısızlık sorunlarına yol açabilir. Bu zorlu özellikler için uyarlanabilir bit hızı akışını veya güçlü sıkıştırmayı uygulamanızı öneririz. Bu, birçok uygulamanın dolaşım sırasında davranışını değiştirme şekline benzer.
    3. Uygulamanızın ağ kaynaklarını kullanma şeklini uyarlayın. Kısıtlanmış ağlar, uygulamalar ağ işlemlerini aralıklı olarak gerçekleştirdiğinde ve zamanın çoğunu ağı kullanmadan geçirdiğinde en iyi şekilde çalışır. Değişken gecikme, gerçek zamanlı senkron iletişimi zorlaştırabilir.

Uygulamanız karmaşık ağ mantığı veya Firebase Cloud Messaging kullanıyorsa yapmanız gereken belirli değişiklikler de vardır.

Kısıtlı ağlar için optimize edilmiş olarak kendini tanımlama

Uygulamanızı sınırlı ağlar için optimize edilmiş olarak tanımlamak ve bu ağları kullanmayı etkinleştirmek için uygulama manifest dosyanızı aşağıdaki gibi bir <meta-data> öğesiyle güncelleyin:

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

Bu öğe, uygulamanızın yalnızca kullanılabilir ağ olduğunda sınırlı bir uydu ağını kullanmasına olanak tanır. Ayrıca, uygulamanızın sınırlı ağlar için optimize edildiğini sisteme bildirir. Bu sayede, ayarlar uygulamasında uydu özellikli uygulamalar arasında listelenerek kullanıcıların uygulamanızı keşfetmesine yardımcı olur.

Kısıtlanmış veri koşullarında davranışı değiştirme

Kısıtlanmış bir ağ kullanırken uygulamanızın davranışını değiştirmeniz gerekiyorsa veya uygulamanızda ağ kullanımını yönetmek için ConnectivityManager kullanan önceden var olan bir mantık varsa ağ akışınızda bazı değişiklikler yapmanız gerekir.

Kısıtlanmış veri koşullarını algılama

Ağ istekleri için kullanılan NetworkCapabilities nesnesi, tüm ağlarda varsayılan olarak ayarlanan ve bant genişliği sınırlı ağlarda kaldırılan bir NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED biti içerir. Bir ağın bant genişliği sınırlı olup olmadığını NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED özelliğinin bulunup bulunmadığını kontrol ederek belirleyebilirsiniz.

Kısıtlanmış ağlarla çalışma

NetworkRequest nesneleri varsayılan olarak NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED özelliğini de içerir. Kısıtlanmış ağların kabul edilebilir olduğunu belirtmek için bu özelliği kaldırın.

Kısıtlanmış bir ağa bağlandığınızı algıladığınızda uygulamanızın özelliklerini gerektiği gibi uyarlayabilirsiniz:

Kotlin

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 = NetworkCallback() {
    override fun onCapabilitiesChanged(net: Network, nc: NetWorkCapabilities) {
        updateAppUseCases(net, nc)
    }

    fun updateAppUseCases(net: Network, nc: NetworkCapabilities) {
        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 unconstrained behavior.
            ...
        }
    }
}
// Where cm is your ConnectivityManager object:
cm.registerBestMatchingNetworkCallback(request, callback, handler)

Java

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

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

// Register for the callback.
NetworkCallback callback = new NetworkCallback() {
    @Override
    public void onCapabilitiesChanged(Network net, NetworkCapabilities nc) {
        updateAppUsecases(net, nc);
    }
    private void updateAppUsecases(Network net, NetworkCapabilities nc) {
        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 unconstrained behavior.
            ...
        }
    }
};
// Where cm is your ConnectivityManager object:
cm.registerBestMatchingNetworkCallback(request, callback, handler);

Kısıtlı ağlarda FCM mesajları alma

Uygulamanız, uygulama sunucusundan mesaj almak için Firebase Cloud Messaging (FCM) kullanıyorsa mesajı FCM sunucusuna iletirken bandwidth_constrained_ok işaretini ekleyerek belirli bir mesajın kısıtlı ağlarda bile teslim edilmesi gerektiğini belirtebilirsiniz:

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

Bir ileti bu işareti içermiyorsa FCM sunucusu, iletiyi yalnızca cihaz sınırsız bir ağ üzerinden bağlandığında teslim eder.