พัฒนาสำหรับเครือข่ายดาวเทียมที่มีข้อจำกัด

สักวันหนึ่งเครือข่ายดาวเทียมจะมีความเสถียรมากพอที่จะทำงานเป็นเครือข่ายปกติ และทำงานร่วมกับกรณีการใช้งานแอปทั้งหมดได้อย่างราบรื่น แต่ในตอนนี้ข้อมูลในเครือข่ายเหล่านี้ ยังคงเป็นทรัพยากรที่หายาก เครือข่ายที่ใช้ดาวเทียมซึ่งมีข้อจำกัดในการใช้ข้อมูลเรียกว่าเครือข่ายดาวเทียมที่มีข้อจำกัด

ด้วยข้อจำกัดเหล่านี้ แอป Android จึงไม่ได้ใช้เครือข่ายเหล่านี้โดยค่าเริ่มต้น หากต้องการให้แอปทำงานในเครือข่ายดาวเทียมที่มีข้อจำกัด คุณต้องระบุว่าแอปของคุณได้รับการเพิ่มประสิทธิภาพสำหรับการใช้ข้อมูลผ่านดาวเทียม และปรับกรณีการใช้งานของแอปเพื่อประหยัดทรัพยากรเมื่อเชื่อมต่อกับเครือข่ายดาวเทียมที่มีข้อจำกัด

ปรับกรณีการใช้งานของแอป

สิ่งที่คุณต้องทำเพื่อให้แอปเข้าถึงเครือข่ายดาวเทียมที่มีข้อจำกัดได้คือ เลือกใช้ แต่คุณอาจต้องทำการเปลี่ยนแปลงเพิ่มเติมเพื่อเพิ่มประสิทธิภาพ ลักษณะการทำงานของแอปเพื่อใช้ทรัพยากรเครือข่ายที่มีจำกัดอย่างมีความรับผิดชอบ ข้อควรพิจารณาเมื่อเพิ่มประสิทธิภาพเพื่อการใช้ข้อมูลที่จำกัดมีดังนี้

  • เครือข่ายดาวเทียมทำงานภายใต้ข้อจำกัดที่มากกว่าเครือข่าย LTE/5G ภาคพื้นดินอย่างมาก โดยมีลักษณะเฉพาะคือมีปริมาณงานต่ำกว่าและเวลาในการตอบสนองสูงกว่า แม้ว่าโดยทั่วไปเราจะแนะนำให้ลดการใช้ข้อมูลเพื่อเหตุผลด้านความน่าเชื่อถือ แต่แอปแต่ละแอปก็มีลักษณะเฉพาะตัว คุณควรประเมินกรณีการใช้งานเฉพาะของคุณเพื่อพิจารณาว่ากลยุทธ์การเพิ่มประสิทธิภาพข้อมูลปัจจุบันให้ประสบการณ์การใช้งานที่ยอมรับได้ในสภาพแวดล้อมที่มีข้อจำกัดเหล่านี้หรือไม่
  • พิจารณาว่าแอปของคุณเหมาะกับการใช้งานในเครือข่ายที่มีข้อจำกัดหรือไม่ แอปบางแอปไม่เหมาะกับเครือข่ายที่มีการจำกัดข้อมูลในทุกกรณี เช่น แอปที่ใช้แบนด์วิดท์สูง เช่น สตรีมมิงวิดีโอ ควรประเมินกลไกการบีบอัดข้อมูลและการนำส่งเนื้อหาเพื่อให้มั่นใจว่าผู้ใช้จะได้รับประสบการณ์การใช้งานที่ราบรื่น หากหลีกเลี่ยงการลดคุณภาพของประสบการณ์การใช้งานเนื่องจากข้อจำกัดด้านข้อมูลไม่ได้ แอปควรดำเนินการต่อไปนี้
    1. แอปอาจเลือกที่จะไม่ใช้เครือข่ายดาวเทียมเลย แต่ก็ยังสามารถระบุการมีอยู่ของเครือข่ายดาวเทียมและแจ้งให้ผู้ใช้ทราบว่าแอปจะไม่ทำงานในเครือข่ายที่จำกัดที่มีอยู่
    2. ระบุกรณีการใช้งานที่เฉพาะเจาะจงเพื่อจำกัดหรือแก้ไข ฟีเจอร์บางอย่างของแอปอาจเหมาะกับเงื่อนไขข้อมูลแบบจำกัดมากกว่าฟีเจอร์อื่นๆ เช่น การดำเนินการที่ใช้แบนด์วิดท์ต่ำอย่างการส่งข้อความจะมีความน่าเชื่อถือสูง อย่างไรก็ตาม การดำเนินการที่ใช้แบนด์วิดท์สูง เช่น การอัปโหลดวิดีโอ HD ที่ไม่ได้บีบอัด อาจทำให้เกิดการบัฟเฟอร์หรือการทำงานล้มเหลวอย่างมาก เราขอแนะนำให้ใช้การสตรีมแบบปรับอัตราบิตหรือการบีบอัดที่มีประสิทธิภาพสำหรับฟีเจอร์ที่ต้องใช้ทรัพยากรสูงเหล่านี้ ซึ่งคล้ายกับวิธีที่แอปจำนวนมากเปลี่ยนลักษณะการทำงานเมื่อ โรมมิ่ง
    3. ปรับวิธีที่แอปใช้ทรัพยากรเครือข่าย เครือข่ายที่มีข้อจำกัด จะทำงานได้ดีที่สุดเมื่อแอปทำการดำเนินการของเครือข่ายเป็นช่วงๆ และใช้เวลาส่วนใหญ่ โดยไม่ใช้เครือข่าย ความหน่วงแปรผันอาจทำให้การสื่อสารแบบเรียลไทม์พร้อมกันเป็นเรื่องยาก

นอกจากนี้ ยังมีการเปลี่ยนแปลงเฉพาะที่คุณต้องทำหากแอปใช้ตรรกะการเชื่อมต่อเครือข่ายที่ซับซ้อนหรือ Firebase Cloud Messaging

ระบุตนเองว่าเพิ่มประสิทธิภาพสำหรับเครือข่ายที่มีข้อจำกัด

หากต้องการระบุว่าแอปของคุณได้รับการเพิ่มประสิทธิภาพสำหรับเครือข่ายที่มีข้อจำกัดและเลือกใช้ เครือข่ายดังกล่าว ให้อัปเดตไฟล์ Manifest ของแอปด้วยองค์ประกอบ <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 โดยค่าเริ่มต้นด้วย นำความสามารถนี้ออก เพื่อระบุว่ายอมรับเครือข่ายที่มีข้อจำกัดได้

เมื่อตรวจพบว่าคุณเชื่อมต่อกับเครือข่ายที่มีข้อจำกัด คุณจะปรับฟีเจอร์ของแอปได้ตามต้องการโดยทำดังนี้

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);

รับข้อความ FCM ในเครือข่ายที่มีข้อจำกัด

หากแอปใช้ Firebase Cloud Messaging (FCM) เพื่อรับข้อความจากเซิร์ฟเวอร์แอป คุณสามารถระบุว่าควรนำส่งข้อความที่เฉพาะเจาะจงแม้ในเครือข่ายที่มีข้อจำกัดได้โดยใส่แฟล็ก bandwidth_constrained_ok เมื่อส่งข้อความไปยังเซิร์ฟเวอร์ FCM

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

หากข้อความไม่มีแฟล็กนี้ เซิร์ฟเวอร์ FCM จะส่งข้อความ เมื่ออุปกรณ์เชื่อมต่อผ่านเครือข่ายที่ไม่จำกัดเท่านั้น