การตั้งค่า Pushwoosh Inbox UI Android
Pushwoosh Inbox UI มาพร้อมกับหน้าจอ inbox ของ Android ที่พร้อมใช้งาน (App Inbox ที่มี “ไอคอนรูประฆัง”) ซึ่งทำงานบน Pushwoosh inbox backend โดยจะแสดงผลข้อความในรูปแบบการ์ด 5 ประเภท รองรับปุ่ม CTA แบบอินไลน์ และสามารถปรับแต่งสไตล์ผ่าน XML attributes หรือโค้ดได้
ข้อกำหนดเบื้องต้น
Anchor link to- Pushwoosh Android SDK พื้นฐาน ได้รับการผสานรวมและสามารถส่ง push ได้แล้ว
- การรองรับ Kotlin ในโมดูลแอปของคุณ (
apply plugin: 'kotlin-android')
เพิ่มไลบรารี
Anchor link toเพิ่มปลั๊กอิน Kotlin และโมดูล Pushwoosh สองตัวในไฟล์ build.gradle ของแอปของคุณ:
apply plugin: 'kotlin-android'
dependencies { implementation 'com.pushwoosh:pushwoosh-inbox:6.+' implementation 'com.pushwoosh:pushwoosh-inbox-ui:6.+'}ปักหมุดเวอร์ชันของ pushwoosh-inbox และ pushwoosh-inbox-ui ให้ตรงกับเวอร์ชันของ com.pushwoosh:pushwoosh ที่คุณมีอยู่ แทนที่ + ด้วยเวอร์ชันปัจจุบันของ Pushwoosh Android SDK
หากแอปของคุณใช้ ProGuard สำหรับการลดขนาดโค้ด ให้คงคลาสปลั๊กอินของ inbox ไว้:
-keep public class com.pushwoosh.inbox.PushwooshInboxPlugin { *;}แสดง inbox
Anchor link toแสดง inbox เป็นหน้าจอเดี่ยว หรือฝังเป็น fragment ภายในเลย์เอาต์ของคุณเอง
ในรูปแบบ activity:
startActivity(Intent(this, InboxActivity::class.java))ในรูปแบบ fragment:
supportFragmentManager.beginTransaction() .replace(R.id.inboxContainer, PushwooshInboxUi.createInboxFragment()) .commitAllowingStateLoss()ประเภทของการ์ด
Anchor link toInbox UI จะกำหนดประเภทของการ์ดสำหรับแต่ละข้อความ ตัวกำหนดจะอ่าน displayType จากอ็อบเจกต์ data ของ push payload ซึ่ง SDK จะส่งมอบภายใต้ actionParams หาก displayType ระบุชื่อประเภทการ์ดที่รู้จัก ระบบจะแสดงผลประเภทนั้นเสมอ โดยจะกลับไปใช้ classic ก็ต่อเมื่อฟิลด์ที่จำเป็นสำหรับประเภทนั้นหายไป การกำหนดนี้ไม่ขึ้นอยู่กับการตั้งค่า heuristic ด้านล่าง
เมื่อไม่มี displayType ข้อความจะแสดงผลเป็นแถวธรรมดา เว้นแต่คุณจะเลือกใช้ heuristic สำหรับรูปภาพ/ข้อความ:
PushwooshInboxStyle.richCardsHeuristicEnabled = trueเมื่อเปิดใช้งาน heuristic รูปภาพที่ไม่มีชื่อเรื่องจะแสดงผลเป็น banner รูปภาพที่มีชื่อเรื่องและเนื้อหาจะแสดงผลเป็น captioned และกรณีอื่นๆ จะกลับไปใช้ classic
displayType | ลักษณะที่ปรากฏ | ฟิลด์ payload ที่จำเป็น | ลดระดับเป็น |
|---|---|---|---|
banner | รูปภาพเต็มขอบ ไม่มีข้อความ | image (ไอคอนข้อความ หรือ data.attachment) | classic เมื่อไม่มีรูปภาพ |
captioned | รูปภาพด้านบน ชื่อเรื่อง + เนื้อหาด้านล่าง | image, title และ content ของข้อความ | classic เมื่อรูปภาพ, ชื่อเรื่อง หรือเนื้อหาหายไป |
classic | ไอคอน + ชื่อเรื่อง + เนื้อหา | — (คาดว่าจะมีชื่อเรื่อง, เนื้อหา และไอคอน) | — |
carousel | แกลเลอรีหลายรูปภาพที่สามารถปัดได้ | title และ content ของข้อความ, data.carousel (1–5 สไลด์) | classic เมื่อไม่มีสไลด์ หรือไม่มีชื่อเรื่อง/เนื้อหา |
video | โปสเตอร์พร้อมป้ายเล่น แตะเพื่อเปิดโปรแกรมเล่นเต็มหน้าจอ | data.video (url + poster (ตัวเลือก)) | classic เมื่อไม่มี descriptor |
การ์ด Apple Wallet จาก iOS InboxKit ไม่มีในเวอร์ชัน Android ข้อความที่มี displayType: "wallet" จะแสดงผลเป็น classic บน Android เสมอ
การ์ด Carousel
Anchor link toสไลด์จะอยู่ใน data.carousel แต่ละสไลด์ต้องมี image ส่วน title (ข้อความซ้อนทับ) และ url (เปิดเมื่อแตะ) เป็นตัวเลือก สไลด์ที่ไม่มีรูปภาพจะถูกทิ้ง และจะแสดงสไลด์ได้สูงสุด 5 สไลด์
{ "request": { "application": "XXXXX-XXXXX", "auth": "API_TOKEN", "notifications": [{ "send_date": "now", "content": "Swipe through this week's drops", "inbox_days": 7, "data": { "displayType": "carousel", "carousel": [ { "image": "https://cdn.example.com/inbox/1.jpg", "title": "New in", "url": "myapp://product/1" }, { "image": "https://cdn.example.com/inbox/2.jpg", "title": "On sale", "url": "myapp://product/2" } ] }, "platforms": [3] }] }}การ์ด Video
Anchor link todescriptor จะอยู่ใน data.video: url เป็นฟิลด์ที่จำเป็น ส่วน poster เป็นรูปภาพตัวอย่าง (ตัวเลือก) การแตะที่โปสเตอร์จะเปิดโปรแกรมเล่นเต็มหน้าจอ
{ "request": { "application": "XXXXX-XXXXX", "auth": "API_TOKEN", "notifications": [{ "send_date": "now", "content": "Tap to play", "inbox_days": 7, "data": { "displayType": "video", "video": { "url": "https://cdn.example.com/inbox/clip.mp4", "poster": "https://cdn.example.com/inbox/poster.jpg" } }, "platforms": [3] }] }}อ่านข้อมูลที่กำหนดเองจากข้อความ
Anchor link toเพื่อให้ push ปรากฏใน inbox, request ของ Messages API createMessage ต้องมี inbox_image, inbox_date, หรือ inbox_days หากไม่มีฟิลด์เหล่านี้ push จะถูกส่งเป็นการแจ้งเตือนปกติและจะไม่ไปถึงฟีดของ inbox ข้อมูลที่กำหนดเองแบบอิสระจะอยู่ภายใต้ data ซึ่ง SDK จะแสดงเป็น actionParams บน InboxMessage:
PushwooshInboxUi.onMessageClickListener = OnInboxMessageClickListener { message -> val params = message.actionParams?.let { JSONObject(it) } val promoId = params?.optString("promo_id") if (!promoId.isNullOrEmpty()) { navigateToPromo(promoId) }}เพิ่มปุ่ม CTA แบบอินไลน์
Anchor link toข้อความสามารถมีปุ่ม call-to-action แบบอินไลน์ภายใน data.buttons:
{ "request": { "application": "XXXXX-XXXXX", "auth": "API_TOKEN", "notifications": [{ "send_date": "now", "content": "Tap a button to claim or save", "inbox_image": "https://cdn.example.com/inbox/promo.png", "inbox_days": 7, "data": { "displayType": "captioned", "promo_id": "SUMMER2026", "buttons": [ { "title": "Claim", "url": "https://example.com/promo/SUMMER2026" }, { "title": "Read", "action": "markRead" }, { "title": "Save", "action": "custom", "tag": "save_promo" } ] }, "platforms": [3] }] }}แต่ละปุ่มต้องมี title การทำงานจะเรียงตามลำดับความสำคัญดังนี้:
actionที่ตั้งค่าเป็นdismissหรือmarkRead(ไม่คำนึงถึงตัวพิมพ์ใหญ่-เล็ก) จะทำงานตามนั้น- มิฉะนั้น
urlที่ไม่ว่างเปล่าและสามารถแยกวิเคราะห์ได้ จะทำงานเป็น actionopenURL - มิฉะนั้น การแตะจะทำงานเป็น custom action และทุกคีย์เพิ่มเติมบนอ็อบเจกต์ปุ่มจะถูกส่งต่อไปยัง listener ของคุณเป็น payload
ดักจับการแตะจาก PushwooshInboxUi.onButtonClickListener คืนค่า true เพื่อให้ SDK ทำงานตามค่าเริ่มต้นของปุ่ม หรือ false เพื่อระงับการทำงาน:
PushwooshInboxUi.onButtonClickListener = OnInboxButtonClickListener { message, button -> when (val action = button.action) { is InboxCardButton.Action.OpenUrl -> true InboxCardButton.Action.Dismiss, InboxCardButton.Action.MarkRead -> true is InboxCardButton.Action.Custom -> { when (action.payload.optString("tag")) { "save_promo" -> saveCurrentPromoLocally(message) } true } }}ปรับแต่งสไตล์
Anchor link toตั้งค่าสี, ฟอนต์ และสถานะว่าง/ข้อผิดพลาดจากโค้ดผ่าน PushwooshInboxStyle:
PushwooshInboxStyle.accentColor = ContextCompat.getColor(this, R.color.brand_accent)PushwooshInboxStyle.titleColor = ContextCompat.getColor(this, R.color.brand_title)PushwooshInboxStyle.listEmptyText = "You have no messages yet"PushwooshInboxStyle.showToolbar = falseหรือใช้ชุด attributes เดียวกันเป็น theme ซึ่งมีรายการอยู่ใน attrs.xml: inboxAccentColor, inboxTitleColor, inboxBackgroundColor, inboxDefaultIcon และ attributes สีและลักษณะที่ปรากฏอื่นๆ ทั้งสองวิธี พร้อมแอปตัวอย่างฉบับเต็ม อยู่ใน repo pushwoosh-inbox-ui-android-sdk InboxSample
ป้ายข้อความที่ยังไม่ได้อ่าน
Anchor link toPushwooshInbox.unreadMessagesCount { result -> if (result.isSuccess) { val count = result.data } else { Log.e("App", "Failed to get unread count", result.exception) }}