Pushwoosh InboxKit iOS सेटअप करना
iOS SDK 7.0.40 से उपलब्ध है।
Pushwoosh InboxKit मौजूदा इनबॉक्स बैकएंड के ऊपर एक आधुनिक UIKit इनबॉक्स स्क्रीन प्रदान करता है। तीन डिफ़ॉल्ट सेल लेआउट सामान्य Braze-शैली के कंटेंट कार्ड आकारों को कवर करते हैं, इनलाइन CTA बटन सबसे आम इंटरैक्शन को संभालते हैं, और यदि आपको एक विशेष लुक की आवश्यकता है तो पूरी सतह सब-क्लासिफिकेशन के लिए खुली है।

बैनर, कैप्शन्ड और क्लासिक कार्ड के साथ डिफ़ॉल्ट InboxKit फ़ीड।
InboxKit का उपयोग कब करें
Anchor link toकिसी भी नए iOS इंटीग्रेशन के लिए InboxKit का उपयोग करें। यह पुराने Objective-C PushwooshInboxUI मॉड्यूल के लिए अनुशंसित प्रतिस्थापन है।
InboxKit आपको देता है:
- तीन अंतर्निहित सेल प्रकार — बैनर, कैप्शन्ड, क्लासिक — जो आपके पुश पेलोड से
actionParams["displayType"]के माध्यम से प्रति संदेश चुने जाते हैं, या कोड सेattributes.forceCellKindके माध्यम से लागू किए जाते हैं। - एक टाइप्ड
PushwooshInboxButtonActionएनम (openURL,dismiss,markRead,custom) के साथ इनलाइन CTA बटन। SDK पहले तीन को स्वचालित रूप से संभालता है; आपका डेलीगेटcustomको आपके अपने लॉजिक पर रूट करता है। - पिनिंग समर्थन:
actionParams["pinned"] == trueवाले संदेश फ़ीड के शीर्ष पर तैरते हैं और एक पिन ग्लिफ़ प्रस्तुत करते हैं। - स्वाइप-टू-डिलीट, पुल-टू-रिफ्रेश, गायब होने पर स्वचालित रूप से पढ़ा हुआ चिह्नित करना — सभी
PushwooshInboxKitAttributesके माध्यम से टॉगल करने योग्य हैं। - स्थायी भंडारण: डिलीट और रीड स्टेट एक प्रक्रिया पुनरारंभ होने पर भी बने रहते हैं, भले ही नेटवर्क कॉल को अभी तक स्वीकार नहीं किया गया हो।
- पूरी तरह से कस्टम लेआउट के लिए एक खुला
PushwooshInboxCellबेस क्लास।
सर्वर अनुबंध अपरिवर्तित है — वही Pushwoosh इनबॉक्स बैकएंड, पेलोड और डैशबोर्ड टूलिंग पहले की तरह काम करते हैं।
अपना इंटीग्रेशन तरीका चुनें
Anchor link to- Swift Package Manager के साथ InboxKit सेटअप करें — नए प्रोजेक्ट्स के लिए अनुशंसित।
- CocoaPods के साथ InboxKit सेटअप करें — पहले से CocoaPods का उपयोग कर रहे प्रोजेक्ट्स के लिए।
संदेश से कस्टम डेटा पढ़ें
Anchor link toइनबॉक्स में एक पुश दिखाने के लिए, Messages API createMessage अनुरोध में inbox_image, inbox_date, या inbox_days शामिल होना चाहिए — इनमें से किसी एक फ़ील्ड के बिना पुश एक नियमित सूचना के रूप में वितरित किया जाता है और कभी भी इनबॉक्स फ़ीड तक नहीं पहुंचता है। फ्री-फॉर्म कस्टम डेटा data कुंजी के तहत जाता है, जिसे SDK क्लाइंट को u पैरामीटर के रूप में वितरित करता है:
{ "request": { "application": "XXXXX-XXXXX", "auth": "API_TOKEN", "notifications": [{ "send_date": "now", "ios_title": "Summer sale", "content": "30% off everything — limited time only", "inbox_image": "https://cdn.example.com/inbox/summer.png", "inbox_days": 7, "data": { "promo_id": "SUMMER2026", "screen": "promo_details" }, "ios_root_params": { "displayType": "captioned" }, "platforms": [1] }] }}SDK उस ऑब्जेक्ट को इनबॉक्स संदेश पर actionParams के माध्यम से उजागर करता है। जब उपयोगकर्ता पंक्ति या इनलाइन CTA पर टैप करता है तो इसे डेलीगेट से पढ़ें:
extension MyInboxHost: PushwooshInboxKitDelegate {
func inboxKit(_ vc: PushwooshInboxKitViewController, didSelect message: PWInboxMessageProtocol) -> Bool { guard let params = message.actionParams as? [String: Any] else { return true }
// The custom `data` object arrives under the "u" key — // either as a nested dictionary or as a JSON-encoded string, // depending on how the payload was built upstream. let custom: [String: Any]? = { if let dict = params["u"] as? [String: Any] { return dict } if let raw = params["u"] as? String, let bytes = raw.data(using: .utf8), let parsed = try? JSONSerialization.jsonObject(with: bytes) as? [String: Any] { return parsed } return nil }()
if let promoId = custom?["promo_id"] as? String { navigateToPromo(promoId) return false // we handled the tap; SDK should not run the default action } return true }}वही actionParams["u"] लुकअप इनलाइन CTA बटनों के लिए inboxKit(_:didTapButton:onMessage:) के अंदर काम करता है। टाइप्ड CTA मामलों (openURL, dismiss, markRead) के लिए SDK पहले से ही डिफ़ॉल्ट क्रिया करता है — उस व्यवहार को बनाए रखने के लिए true लौटाएं, या इसे दबाने और अपना खुद का चलाने के लिए false लौटाएं।
इनलाइन CTA बटन जोड़ें
Anchor link toएक संदेश में तीन तक इनलाइन कॉल-टू-एक्शन बटन हो सकते हैं। बटन data के अंदर अन्य कस्टम डेटा के साथ buttons ऐरे के रूप में रहते हैं। SDK उन्हें कैप्शन्ड और क्लासिक सेल के अंदर स्वतः-रेंडर करता है:
{ "request": { "application": "XXXXX-XXXXX", "auth": "API_TOKEN", "notifications": [{ "send_date": "now", "ios_title": "New promo card", "content": "Tap a button to claim or save", "inbox_image": "https://cdn.example.com/inbox/promo.png", "inbox_days": 7, "data": { "promo_id": "SUMMER2026", "buttons": [ { "title": "Claim", "url": "https://example.com/promo/SUMMER2026" }, { "title": "Read", "action": "markRead" }, { "title": "Save", "action": "custom", "tag": "save_promo" } ] }, "ios_root_params": { "displayType": "captioned" }, "platforms": [1] }] }}प्रत्येक बटन ऑब्जेक्ट में ये फ़ील्ड होते हैं:
| फ़ील्ड | प्रकार | कब |
|---|---|---|
title | स्ट्रिंग | आवश्यक। दृश्यमान बटन लेबल। |
url | स्ट्रिंग | एक गैर-खाली पार्स करने योग्य URL एक openURL क्रिया उत्पन्न करता है। SDK इसे UIApplication.shared.open के माध्यम से खोलता है जब तक कि आपका डेलीगेट इसे दबा न दे। |
action | स्ट्रिंग | स्पष्ट क्रिया टोकन: dismiss (संदेश को फ़ीड से हटाता है), markRead (संदेश को पढ़ा हुआ चिह्नित करता है), या custom (होस्ट-हैंडल्ड)। केस-असंवेदनशील। |
| कुछ और | कोई भी | जब action custom होता है, तो बटन ऑब्जेक्ट पर title और action को छोड़कर हर कुंजी आपके डेलीगेट को कस्टम पेलोड के रूप में अग्रेषित की जाती है — मार्केटर के साथ एक कुंजी पर सहमत हों (जैसे tag) और उस पर डिस्पैच करें। |
रिज़ॉल्यूशन प्राथमिकता: पहले स्पष्ट action टोकन, फिर url यदि गैर-खाली है, अन्यथा बटन custom में आता है जिसमें पूरा पेलोड होता है (title और action को छोड़कर)।
अपने डेलीगेट से टैप को इंटरसेप्ट करें। button.action प्रॉपर्टी टाइप्ड PushwooshInboxButtonAction एनम है:
extension MyInboxHost: PushwooshInboxKitDelegate {
func inboxKit(_ vc: PushwooshInboxKitViewController, didTapButton button: PushwooshInboxButton, onMessage message: PWInboxMessageProtocol) -> Bool { switch button.action { case .openURL(let url): // Default behavior is fine — let SDK open the URL. return true
case .dismiss, .markRead: // SDK handles both. Return false if you want to override. return true
case .custom(let payload): // Marketer-defined custom button. Dispatch on a key you agreed on. if let tag = payload["tag"] as? String { switch tag { case "save_promo": saveCurrentPromoLocally(message: message) default: break } } return true // ignored for custom — SDK never runs a default action here } }}