เริ่มต้นใช้งานการกำหนดค่าระยะไกลใน Android

เลือกแพลตฟอร์ม: iOS+ Android เว็บ Flutter Unity C++


คุณใช้ Firebase Remote Config เพื่อกำหนดพารามิเตอร์ในแอปและ อัปเดตค่าในระบบคลาวด์ได้ ซึ่งจะช่วยให้คุณแก้ไขรูปลักษณ์และ ลักษณะการทำงานของแอปได้โดยไม่ต้องเผยแพร่การอัปเดตแอป คู่มือนี้จะแนะนำขั้นตอนการเริ่มต้นใช้งานและแสดงตัวอย่างโค้ด ซึ่งทั้งหมดนี้พร้อมให้โคลนหรือดาวน์โหลดจากที่เก็บ firebase/quickstart-android บน GitHub

ขั้นตอนที่ 1: เพิ่ม Firebase และ SDK การกำหนดค่าระยะไกลลงในแอป

  1. เพิ่ม Firebase ลงในโปรเจ็กต์ Android หากยังไม่ได้เพิ่ม

  2. สำหรับ Remote Config ต้องใช้ Google Analytics ในการ กำหนดเป้าหมายแบบมีเงื่อนไขของอินสแตนซ์แอป ไปยังพร็อพเพอร์ตี้ผู้ใช้และกลุ่มเป้าหมาย ตรวจสอบว่าคุณได้เปิดใช้ Google Analytics ในโปรเจ็กต์แล้ว

  3. ในไฟล์ Gradle ของโมดูล (ระดับแอป) (โดยมากจะเป็น <project>/<app-module>/build.gradle.kts หรือ <project>/<app-module>/build.gradle) ให้เพิ่มทรัพยากร Dependency สำหรับคลัง Remote Config และ Analytics สำหรับ Android เราขอแนะนำให้ใช้ Firebase Android BoM เพื่อควบคุมการกำหนดเวอร์ชันของไลบรารี

    นอกจากนี้ ในขั้นตอนการตั้งค่า Analytics คุณต้องเพิ่ม Firebase SDK สำหรับ Google Analytics ลงในแอปด้วย

    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:34.6.0"))
    
        // Add the dependencies for the Remote Config and Analytics libraries
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-config")
    implementation("com.google.firebase:firebase-analytics")
    }

    การใช้ Firebase Android BoM จะทำให้แอปใช้ไลบรารี Firebase Android เวอร์ชันที่เข้ากันได้อยู่เสมอ

    (ทางเลือก)  เพิ่มการอ้างอิงไลบรารี Firebase โดยไม่ใช้ BoM

    หากเลือกที่จะไม่ใช้ Firebase BoM คุณต้องระบุเวอร์ชันของไลบรารี Firebase แต่ละรายการ ในบรรทัดการอ้างอิง

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

    dependencies {
        // Add the dependencies for the Remote Config and Analytics libraries
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-config:23.0.1")
    implementation("com.google.firebase:firebase-analytics:23.0.0")
    }

ขั้นตอนที่ 2: สร้างออบเจ็กต์ Remote Config Singleton

สร้างอินสแตนซ์ออบเจ็กต์ Remote Config แล้วตั้งช่วงการดึงข้อมูลขั้นต่ำเพื่อให้มีการรีเฟรชบ่อยๆ

Kotlin

val remoteConfig: FirebaseRemoteConfig = Firebase.remoteConfig
val configSettings = remoteConfigSettings {
    minimumFetchIntervalInSeconds = 3600
}
remoteConfig.setConfigSettingsAsync(configSettings)

Java

FirebaseRemoteConfig mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance();
FirebaseRemoteConfigSettings configSettings = new FirebaseRemoteConfigSettings.Builder()
        .setMinimumFetchIntervalInSeconds(3600)
        .build();
mFirebaseRemoteConfig.setConfigSettingsAsync(configSettings);

ออบเจ็กต์ Singleton ใช้เพื่อจัดเก็บค่าพารามิเตอร์เริ่มต้นในแอป ดึงค่าพารามิเตอร์ที่อัปเดตจากแบ็กเอนด์ และควบคุมเวลาที่ค่าที่ดึงมาจะพร้อมใช้งานในแอป

ในระหว่างการพัฒนา เราขอแนะนําให้ตั้งค่าช่วงเวลาการดึงข้อมูลขั้นต่ำที่ค่อนข้างต่ำ ดูข้อมูลเพิ่มเติมได้ที่การควบคุมอัตราการส่ง

ขั้นตอนที่ 3: ตั้งค่าพารามิเตอร์เริ่มต้นในแอป

คุณสามารถตั้งค่าพารามิเตอร์เริ่มต้นในแอปได้ในRemote Config ออบเจ็กต์ เพื่อให้แอปทํางานตามที่ต้องการก่อนที่จะเชื่อมต่อกับ Remote Configแบ็กเอนด์ และเพื่อให้ค่าเริ่มต้นพร้อมใช้งานหากไม่มีการตั้งค่าในแบ็กเอนด์

  1. กำหนดชุดชื่อพารามิเตอร์และค่าพารามิเตอร์เริ่มต้นโดยใช้ออบเจ็กต์ Map หรือไฟล์ทรัพยากร XML ที่จัดเก็บไว้ในโฟลเดอร์ res/xml ของแอป แอปตัวอย่างRemote Configเริ่มต้นใช้งาน ใช้ไฟล์ XML เพื่อกำหนดชื่อและค่าพารามิเตอร์เริ่มต้น

    หากกำหนดค่าRemote Configค่าพารามิเตอร์แบ็กเอนด์แล้ว คุณสามารถดาวน์โหลดไฟล์ XML ที่สร้างขึ้นซึ่งมีค่าเริ่มต้นทั้งหมดและ บันทึกลงในไดเรกทอรี res/xml ของแอปได้โดยทำดังนี้

    REST

    curl --compressed -D headers -H "Authorization: Bearer token" -X GET https://firebaseremoteconfig.googleapis.com/v1/projects/my-project-id/remoteConfig:downloadDefaults?format=XML -o remote_config_defaults.xml
    

    คุณสร้างโทเค็น Bearer ได้โดยเรียกใช้คำสั่งต่อไปนี้โดยใช้ Google Cloud CLI หรือ Cloud Shell

    gcloud auth print-access-token
    

    โทเค็นนี้มีอายุสั้น คุณจึงอาจต้องสร้างโทเค็นใหม่หากได้รับ ข้อผิดพลาดในการตรวจสอบสิทธิ์

    Firebase คอนโซล

    1. ในแท็บพารามิเตอร์ ให้เปิดเมนู แล้วเลือกดาวน์โหลดค่าเริ่มต้น

    2. เมื่อระบบแจ้ง ให้เปิดใช้ .xml สำหรับ Android แล้วคลิกดาวน์โหลดไฟล์

  2. เพิ่มค่าเหล่านี้ลงในออบเจ็กต์ Remote Config โดยใช้ setDefaultsAsync(int) ดังที่แสดง

    Kotlin

    remoteConfig.setDefaultsAsync(R.xml.remote_config_defaults)

    Java

    mFirebaseRemoteConfig.setDefaultsAsync(R.xml.remote_config_defaults);

ขั้นตอนที่ 4: รับค่าพารามิเตอร์สำหรับใช้ในแอป

ตอนนี้คุณรับค่าพารามิเตอร์จากออบเจ็กต์ Remote Config ได้แล้ว หากคุณตั้งค่าในแบ็กเอนด์ ให้ดึงข้อมูลและเปิดใช้งานค่าเหล่านั้น ค่าเหล่านั้นจะพร้อมใช้งานในแอปของคุณ มิฉะนั้น คุณจะได้รับค่าพารามิเตอร์ในแอปที่กำหนดค่าโดยใช้ setDefaultsAsync(int) หากต้องการรับค่าเหล่านี้ ให้เรียกใช้เมธอดที่ระบุไว้ในโค้ดต่อไปนี้ซึ่งแมปกับ ประเภทข้อมูลที่แอปของคุณคาดหวัง โดยระบุคีย์พารามิเตอร์เป็นอาร์กิวเมนต์

ขั้นตอนที่ 5: ตั้งค่าพารามิเตอร์ในRemote Configแบ็กเอนด์

การใช้FirebaseคอนโซลหรือRemote Configแบ็กเอนด์ API คุณสามารถสร้างค่าเริ่มต้นใหม่ฝั่งเซิร์ฟเวอร์ ที่ลบล้างค่าในแอปตามตรรกะแบบมีเงื่อนไขหรือการกำหนดเป้าหมายผู้ใช้ที่ต้องการ ส่วนนี้อธิบายFirebaseขั้นตอนในคอนโซล เพื่อสร้างค่าเหล่านี้

  1. เปิดโปรเจ็กต์ในคอนโซล Firebase
  2. เลือก Remote Config จากเมนูเพื่อดูRemote Config แดชบอร์ด
  3. กําหนดพารามิเตอร์ที่มีชื่อเดียวกับพารามิเตอร์ที่คุณกําหนดไว้ใน แอป สําหรับแต่ละพารามิเตอร์ คุณสามารถตั้งค่าเริ่มต้น (ซึ่งจะ ลบล้างค่าเริ่มต้นในแอปที่เกี่ยวข้องในที่สุด) และยังตั้งค่าแบบมีเงื่อนไขได้ด้วย ดูข้อมูลเพิ่มเติมได้ที่Remote Config พารามิเตอร์และเงื่อนไข
  4. หากใช้เงื่อนไข สัญญาณที่กำหนดเอง ให้กำหนดแอตทริบิวต์และค่าของแอตทริบิวต์ ตัวอย่างต่อไปนี้แสดงวิธี กำหนดเงื่อนไขสัญญาณที่กำหนดเอง

    Kotlin

            val customSignals = customSignals {
                put("city", "Tokyo")
                put("preferred_event_category", "sports")
            }
    
            remoteConfig.setCustomSignals(customSignals)
        

    Java

            CustomSignals customSignals = new CustomSignals.Builder()
                .put("city", "Tokyo")
                .put("preferred_event_category", "sports")
                .build();
    
            mFirebaseRemoteConfig.setCustomSignals(customSignals);
    
        

ขั้นตอนที่ 6: ดึงข้อมูลและเปิดใช้งานค่า

  1. หากต้องการดึงค่าพารามิเตอร์จากแบ็กเอนด์ Remote Config ให้เรียกใช้เมธอด fetch() ระบบจะดึงค่าที่คุณตั้งไว้ในแบ็กเอนด์และจัดเก็บไว้ในออบเจ็กต์ Remote Config
  2. หากต้องการให้ค่าพารามิเตอร์ที่ดึงข้อมูลมาพร้อมใช้งานในแอป ให้เรียกใช้เมธอด activate()

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

    Kotlin

    remoteConfig.fetchAndActivate()
        .addOnCompleteListener(this) { task ->
            if (task.isSuccessful) {
                val updated = task.result
                Log.d(TAG, "Config params updated: $updated")
                Toast.makeText(
                    this,
                    "Fetch and activate succeeded",
                    Toast.LENGTH_SHORT,
                ).show()
            } else {
                Toast.makeText(
                    this,
                    "Fetch failed",
                    Toast.LENGTH_SHORT,
                ).show()
            }
            displayWelcomeMessage()
        }

    Java

    mFirebaseRemoteConfig.fetchAndActivate()
            .addOnCompleteListener(this, new OnCompleteListener<Boolean>() {
                @Override
                public void onComplete(@NonNull Task<Boolean> task) {
                    if (task.isSuccessful()) {
                        boolean updated = task.getResult();
                        Log.d(TAG, "Config params updated: " + updated);
                        Toast.makeText(MainActivity.this, "Fetch and activate succeeded",
                                Toast.LENGTH_SHORT).show();
    
                    } else {
                        Toast.makeText(MainActivity.this, "Fetch failed",
                                Toast.LENGTH_SHORT).show();
                    }
                    displayWelcomeMessage();
                }
            });

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

ขั้นตอนที่ 7: ฟังข้อมูลอัปเดตแบบเรียลไทม์

หลังจากดึงค่าพารามิเตอร์แล้ว คุณจะใช้ Remote Config แบบเรียลไทม์เพื่อ ฟังการอัปเดตจากแบ็กเอนด์ของ Remote Config ได้ ส่งสัญญาณแบบเรียลไทม์ Remote Config ไปยังอุปกรณ์ที่เชื่อมต่อเมื่อมีการอัปเดต และ ดึงข้อมูลการเปลี่ยนแปลงโดยอัตโนมัติหลังจากที่คุณเผยแพร่Remote Config เวอร์ชันใหม่

Firebase SDK สำหรับ Android v21.3.0 ขึ้นไป ( Firebase BoM v31.2.4 ขึ้นไป) รองรับการอัปเดตแบบเรียลไทม์

  1. ในแอป ให้ใช้ addOnConfigUpdateListener() เพื่อเริ่มฟัง การอัปเดตและดึงค่าพารามิเตอร์ใหม่โดยอัตโนมัติ ใช้ onUpdate()การเรียกกลับเพื่อเปิดใช้งานการกำหนดค่าที่อัปเดตแล้ว

    Kotlin

    remoteConfig.addOnConfigUpdateListener(object : ConfigUpdateListener {
            override fun onUpdate(configUpdate : ConfigUpdate) {
            Log.d(TAG, "Updated keys: " + configUpdate.updatedKeys);
    
            if (configUpdate.updatedKeys.contains("welcome_message")) {
                remoteConfig.activate().addOnCompleteListener {
                    displayWelcomeMessage()
                }
            }
            }
    
            override fun onError(error : FirebaseRemoteConfigException) {
                Log.w(TAG, "Config update error with code: " + error.code, error)
            }
        })
        

    Java

        mFirebaseRemoteConfig.addOnConfigUpdateListener(new ConfigUpdateListener() {
            @Override
            public void onUpdate(ConfigUpdate configUpdate) {
                Log.d(TAG, "Updated keys: " + configUpdate.getUpdatedKeys());
                mFirebaseRemoteConfig.activate().addOnCompleteListener(new OnCompleteListener<Boolean>() {
                    @Override
                    public void onComplete(@NonNull Task<Boolean> task) {
                        displayWelcomeMessage();
                    }
                });
            }
            @Override
            public void onError(FirebaseRemoteConfigException error) {
                Log.w(TAG, "Config update error with code: " + error.getCode(), error);
            }
        });
        
  2. ในครั้งถัดไปที่คุณเผยแพร่ Remote Config เวอร์ชันใหม่ อุปกรณ์ ที่เรียกใช้แอปของคุณและรอฟังการเปลี่ยนแปลงจะเรียกใช้ ConfigUpdateListener

การควบคุม

หากแอปดึงข้อมูลหลายครั้งเกินไปในช่วงเวลาสั้นๆ ระบบจะจำกัดอัตราการเรียกดึงข้อมูลและ SDK จะแสดงผล FirebaseRemoteConfigFetchThrottledException ก่อน SDK เวอร์ชัน 17.0.0 ขีดจำกัดคือคำขอเรียกข้อมูล 5 รายการในกรอบเวลา 60 นาที (เวอร์ชันใหม่กว่ามีขีดจำกัดที่ผ่อนปรนมากกว่า)

ในระหว่างการพัฒนาแอป คุณอาจต้องการดึงและเปิดใช้งานการกำหนดค่าบ่อยมาก (หลายครั้งต่อชั่วโมง) เพื่อให้คุณทำซ้ำได้อย่างรวดเร็วขณะพัฒนาและทดสอบแอป การอัปเดตแบบเรียลไทม์Remote Configจะข้ามแคชโดยอัตโนมัติ เมื่อมีการอัปเดตการกำหนดค่าในเซิร์ฟเวอร์ หากต้องการรองรับการทำซ้ำอย่างรวดเร็ว ในโปรเจ็กต์ที่มีนักพัฒนาแอปสูงสุด 10 คน คุณสามารถตั้งค่า ออบเจ็กต์ FirebaseRemoteConfigSettingsชั่วคราวโดยมีช่วงการดึงข้อมูลขั้นต่ำต่ำ (setMinimumFetchIntervalInSeconds) ในแอป

ช่วงเวลาการดึงข้อมูลขั้นต่ำเริ่มต้นสำหรับ Remote Config คือ 12 ชั่วโมง ซึ่งหมายความว่าระบบจะไม่ดึงข้อมูลการกำหนดค่าจากแบ็กเอนด์มากกว่า 1 ครั้งในกรอบเวลา 12 ชั่วโมง ไม่ว่าจะมีจำนวนการเรียกดึงข้อมูลจริงกี่ครั้งก็ตาม โดยเฉพาะอย่างยิ่ง ระบบจะกำหนด ช่วงเวลาการดึงข้อมูลขั้นต่ำตามลำดับต่อไปนี้

  1. พารามิเตอร์ใน fetch(long)
  2. พารามิเตอร์ใน FirebaseRemoteConfigSettings.setMinimumFetchIntervalInSeconds(long)
  3. ค่าเริ่มต้นคือ 12 ชั่วโมง

หากต้องการตั้งค่าช่วงเวลาการดึงข้อมูลขั้นต่ำเป็นค่าที่กำหนดเอง ให้ใช้ FirebaseRemoteConfigSettings.Builder.setMinimumFetchIntervalInSeconds(long)