ข้ามไปยังเนื้อหา

Feature flags ใน Android SDK

Pushwoosh.getInstance().featureFlags มอบ feature flags ที่กำหนดค่าไว้สำหรับแอปพลิเคชันใน Control Panel ให้กับแอป Android ของคุณ Pushwoosh จะประเมินกฎของ flag บนเซิร์ฟเวอร์สำหรับอุปกรณ์และผู้ใช้ปัจจุบัน แล้ว SDK จะส่งคืนผลลัพธ์ว่า flag เปิดอยู่สำหรับอุปกรณ์นี้หรือไม่ และใช้ค่าพร็อพเพอร์ตีใดบ้าง

ข้อกำหนดเบื้องต้น

Anchor link to
  • Pushwoosh Android SDK 6.16.0 ขึ้นไป ที่ผสานรวมตามที่อธิบายไว้ในคู่มือ Android SDK feature flags เป็นส่วนหนึ่งของไลบรารีหลัก com.pushwoosh:pushwoosh คุณจึงไม่ต้องเพิ่ม dependency อื่น จนกว่า SDK จะเริ่มต้นการทำงาน get จะส่งคืน null
  • มี flag อย่างน้อยหนึ่งรายการที่สร้างไว้ใน Audience → Feature Flags คุณต้องใช้ Key ของ flag นั้น รวมถึงคีย์และประเภทของพร็อพเพอร์ตี ใช้คีย์ให้ตรงตามที่แสดงไว้ทุกประการ รวมถึงตัวพิมพ์เล็กและพิมพ์ใหญ่ ตัวอย่างเช่น get("New_Checkout") จะไม่พบ flag ที่มีคีย์ new_checkout

อ่าน flag

Anchor link to

ส่งค่าเริ่มต้นทุกครั้ง ค่านี้จะมีผลจนกว่า SDK จะได้รับ flag สำหรับอุปกรณ์ และมีผลทุกครั้งที่ flag ไม่มีอยู่ ถูกเก็บถาวร หรือแพ็กเกจไม่รวม feature flags

import com.pushwoosh.Pushwoosh
val flags = Pushwoosh.getInstance().featureFlags
val checkout = flags.get("new_checkout")
if (checkout != null && checkout.isEnabled) {
showNewCheckout(
buttonColor = checkout.getString("button_color", "blue"),
maxItems = checkout.getNumber("max_items", 3.0).toInt(),
)
} else {
showOldCheckout()
}

หากต้องการตรวจสอบเพียงว่า flag เปิดอยู่หรือไม่ ให้ใช้ isEnabled:

val isNewCheckout = Pushwoosh.getInstance().featureFlags.isEnabled("new_checkout", false)

ใน Java ให้เรียก Pushwoosh.getInstance().getFeatureFlags()

สิ่งที่ flag ส่งคืน

Anchor link to

get(key) จะส่งคืนออบเจ็กต์ FeatureFlag หรือ null เมื่อ SDK ยังไม่มี flag สำหรับอุปกรณ์ หรือ flag ไม่อยู่ในคำตอบ flag ที่ถูกเก็บถาวรจะไม่อยู่ในคำตอบ get จะอ่านเฉพาะ flag ที่จัดเก็บไว้และไม่รอเครือข่ายเลย ออบเจ็กต์มีฟิลด์ดังนี้:

ฟิลด์ประเภทคำอธิบาย
keyStringคีย์ของ flag
isEnabledBooleanflag เปิดอยู่สำหรับอุปกรณ์นี้หรือไม่
ruleIdStringกฎที่ตัดสินผลลัพธ์ เช่น r_1a2b3c4d เป็น default เมื่อไม่มีกฎใดตรงกับอุปกรณ์ และเป็นสตริงว่างเมื่อ flag ถูก kill

อ่านค่าพร็อพเพอร์ตีด้วย getter ที่ตรงกับประเภทของพร็อพเพอร์ตี getter แต่ละตัวจะส่งคืนค่าเริ่มต้นของคุณเมื่อไม่มีพร็อพเพอร์ตีนั้น หรือพร็อพเพอร์ตีมีค่าเป็นประเภทอื่น เมื่อ flag ปิดอยู่ พร็อพเพอร์ตีจะมีค่าเริ่มต้นที่ตั้งไว้ใน Control Panel

เมธอดส่งคืน
getString(property, defaultValue)ค่าของพร็อพเพอร์ตีประเภท String
getNumber(property, defaultValue)ค่าของพร็อพเพอร์ตีประเภท Number ในรูปแบบ Double
getBool(property, defaultValue)ค่าของพร็อพเพอร์ตีประเภท Boolean
getJsonObject(property, defaultValue)ค่าของพร็อพเพอร์ตีประเภท JSON ที่เก็บออบเจ็กต์ ในรูปแบบ JSONObject
getJsonArray(property, defaultValue)ค่าของพร็อพเพอร์ตีประเภท JSON ที่เก็บอาร์เรย์ ในรูปแบบ JSONArray

isEnabled(key, defaultValue) จะส่งคืน defaultValue เมื่อ get(key) ส่งคืน null

ทำให้ flag เป็นปัจจุบันอยู่เสมอ

Anchor link to

SDK จะจัดเก็บคำตอบล่าสุดไว้บนอุปกรณ์นานสูงสุด 24 ชั่วโมง flag ที่จัดเก็บไว้จะใช้ได้เฉพาะกับ User ID ที่ใช้ขอ flag เหล่านั้นเท่านั้น SDK จะรีเฟรช flag ในกรณีต่อไปนี้:

  • เมื่อเซสชันเริ่มต้น กล่าวคือ เมื่อแอปขึ้นมาอยู่เบื้องหน้าเป็นครั้งแรก หรือหลังจากอยู่ในเบื้องหลังอย่างน้อย 30 นาที
  • ทุกชั่วโมงขณะที่แอปอยู่เบื้องหน้า
  • หลังจากอุปกรณ์ลงทะเบียนเป็นครั้งแรก
  • ทันทีหลังจาก User ID เปลี่ยนด้วย setUserId flag ที่จัดเก็บไว้ของผู้ใช้ก่อนหน้าจะถูกทิ้ง ดังนั้นผู้ใช้ใหม่จะไม่เห็น flag เหล่านั้นเลย

หากต้องการตอบสนองต่อค่าใหม่ ให้ลงทะเบียน listener ซึ่งจะถูกเรียกหลังจากการรีเฟรชที่ทำให้ค่าของ flag ใดๆ เปลี่ยนไป:

import com.pushwoosh.featureflags.FeatureFlagsUpdateListener
private val flagsListener = FeatureFlagsUpdateListener { render() }
override fun onStart() {
super.onStart()
Pushwoosh.getInstance().featureFlags.addUpdateListener(flagsListener)
}
override fun onStop() {
Pushwoosh.getInstance().featureFlags.removeUpdateListener(flagsListener)
super.onStop()
}

หากต้องการขอ flag ด้วยตัวเอง เช่น หลังจากการกระทำที่อาจทำให้ผู้ใช้ย้ายไปอยู่ใน Segment อื่น ให้เรียก refresh ขณะที่ flag ที่จัดเก็บไว้ยังใช้ได้ เมธอดนี้จะส่งคำขอได้สูงสุดหนึ่งครั้งต่อ 5 นาที และภายในช่วงเวลานั้นจะตอบกลับด้วย flag ที่จัดเก็บไว้ callback จะทำงานบนเธรดหลัก:

Pushwoosh.getInstance().featureFlags.refresh { result ->
if (!result.isSuccess) {
val status = result.exception?.httpStatus
// the stored flags, or your defaults, stay in effect
}
render()
}

เมื่อล้มเหลว result.exception จะเป็น FeatureFlagsException โดย httpStatus ของออบเจ็กต์นี้จะเป็น 0 เมื่อคำขอไม่ได้รับการตอบกลับ HTTP และเป็น 200 เมื่อเซิร์ฟเวอร์ตอบกลับแล้วแต่ไม่สามารถใช้คำตอบนั้นได้

หาก Pushwoosh ไม่สามารถจับคู่ Segment ของอุปกรณ์ได้ทันเวลา ระบบจะส่งคืนคำตอบบางส่วน SDK จะไม่จัดเก็บคำตอบนี้ และการรีเฟรชครั้งถัดไปจะนำคำตอบฉบับสมบูรณ์มาให้

เมื่อ flag ถูก kill ใน Control Panel อุปกรณ์จะได้รับ flag นั้นในสถานะปิดพร้อมค่าพร็อพเพอร์ตีเริ่มต้นในการรีเฟรชครั้งถัดไป เมื่อ SDK ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ได้ ก็จะใช้ flag ที่จัดเก็บไว้ต่อไปจนกว่าจะมีอายุครบ 24 ชั่วโมง และหลังจากนั้นจะใช้ค่าเริ่มต้นของคุณ

บันทึก impression

Anchor link to

impression จะแจ้ง Pushwoosh ว่าผู้ใช้เข้าถึงโค้ดที่ flag ควบคุมจริง เพื่อให้คุณเปรียบเทียบผู้ใช้ที่ได้รับฟีเจอร์กับผู้ที่ไม่ได้รับได้ เรียก logImpression(key) ในขณะที่ผู้ใช้เห็นฟีเจอร์หรือเวอร์ชันเก่าของฟีเจอร์ ทั้งในสาขาที่เปิดและสาขาที่ปิด เพราะผู้ใช้ที่ flag ปิดอยู่คือกลุ่มเปรียบเทียบของคุณ:

val flags = Pushwoosh.getInstance().featureFlags
val isOn = flags.isEnabled("new_checkout", false)
flags.logImpression("new_checkout")
if (isOn) {
showNewCheckout()
} else {
showOldCheckout()
}

SDK จะส่ง Event PW_FeatureFlagImpression พร้อมแอตทริบิวต์ต่อไปนี้:

แอตทริบิวต์ประเภทค่า
flag_keystringคีย์ของ flag
rule_idstringกฎที่ตัดสินผลลัพธ์ เช่นเดียวกับใน ruleId
enabledbooleanflag เปิดอยู่หรือไม่

คุณไม่จำเป็นต้องสร้าง Event ไว้ล่วงหน้า เพราะ Pushwoosh จะเพิ่ม PW_FeatureFlagImpression พร้อมแอตทริบิวต์เหล่านี้ลงใน Audience → Events เมื่อ impression แรกมาถึง SDK จะส่ง impression หนึ่งครั้งต่อ flag กฎ และสถานะในหนึ่งเซสชัน และจะไม่ส่งอะไรเลยเมื่อไม่มี flag สำหรับคีย์นั้น

impression ยังช่วยให้นักการตลาดสร้าง Segment ของผู้ใช้ที่เข้าถึงฟีเจอร์ได้ด้วย นั่นคือสถานะ เห็นฟีเจอร์ (30 วัน) ของเงื่อนไข feature flag

ข้อมูลอ้างอิงเมธอด

Anchor link to

Pushwoosh.getInstance().featureFlags มีเมธอดดังนี้:

เมธอดคำอธิบาย
get(key)ส่งคืน FeatureFlag สำหรับคีย์ หรือ null อ่านเฉพาะ flag ที่จัดเก็บไว้
isEnabled(key, defaultValue)ส่งคืนว่า flag เปิดอยู่หรือไม่ หรือ defaultValue เมื่อไม่มี flag
refresh(callback)ขอ flag โดยจำกัดไว้ที่หนึ่งครั้งต่อ 5 นาทีขณะที่ flag ที่จัดเก็บไว้ยังใช้ได้ callback จะได้รับ Result ที่มี FeatureFlagsException เมื่อล้มเหลว และ callback อาจเป็น null ได้
addUpdateListener(listener)เรียก listener หลังจากการรีเฟรชทุกครั้งที่ทำให้ค่าของ flag เปลี่ยนไป
removeUpdateListener(listener)ลบ listener ที่เพิ่มไว้ด้วย addUpdateListener
logImpression(key)ส่ง Event PW_FeatureFlagImpression สำหรับกฎและสถานะปัจจุบันของ flag