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

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

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

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

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

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

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