বিষয়বস্তুতে যান

Pushwoosh InboxKit iOS সেট আপ করা

iOS SDK 7.0.40 থেকে উপলব্ধ।

Pushwoosh InboxKit বিদ্যমান ইনবক্স ব্যাকএন্ডের উপরে একটি আধুনিক UIKit ইনবক্স স্ক্রিন সরবরাহ করে। তিনটি ডিফল্ট সেল লেআউট সাধারণ ব্রেজ-স্টাইলের কন্টেন্ট কার্ডের আকারগুলিকে কভার করে, ইনলাইন CTA বোতামগুলি সবচেয়ে সাধারণ ইন্টারঅ্যাকশনগুলি পরিচালনা করে, এবং যদি আপনার একটি বেসপোক লুকের প্রয়োজন হয় তবে পুরো সারফেসটি সাবক্লাসিংয়ের জন্য উন্মুক্ত।

ইনলাইন বোতাম এবং অপঠিত সূচক সহ ব্যানার, ক্যাপশনযুক্ত এবং ক্লাসিক কার্ড দেখানো InboxKit ফিড

ব্যানার, ক্যাপশনযুক্ত, এবং ক্লাসিক কার্ড সহ ডিফল্ট InboxKit ফিড।

কখন InboxKit ব্যবহার করবেন

Anchor link to

যেকোনো নতুন iOS ইন্টিগ্রেশনের জন্য InboxKit ব্যবহার করুন। এটি পুরোনো Objective-C PushwooshInboxUI মডিউলের জন্য প্রস্তাবিত প্রতিস্থাপন।

InboxKit আপনাকে দেয়:

  • তিনটি বিল্ট-ইন সেল টাইপ — ব্যানার, ক্যাপশনযুক্ত, ক্লাসিক — যা আপনার পুশ পেলোড থেকে actionParams["displayType"] এর মাধ্যমে প্রতি মেসেজের জন্য নির্বাচিত হয়, অথবা কোড থেকে attributes.forceCellKind এর মাধ্যমে জোর করে সেট করা হয়।
  • একটি টাইপড PushwooshInboxButtonAction enum (openURL, dismiss, markRead, custom) সহ ইনলাইন CTA বোতাম। SDK প্রথম তিনটি স্বয়ংক্রিয়ভাবে পরিচালনা করে; আপনার ডেলিগেট custom কে আপনার নিজস্ব লজিকে রুট করে।
  • পিনিং সাপোর্ট: actionParams["pinned"] == true সহ মেসেজগুলি ফিডের শীর্ষে ভাসে এবং একটি পিন গ্লিফ রেন্ডার করে।
  • সোয়াইপ-টু-ডিলিট, পুল-টু-রিফ্রেশ, অদৃশ্য হওয়ার সাথে সাথে স্বয়ংক্রিয়ভাবে পঠিত হিসাবে চিহ্নিত করা — সবই PushwooshInboxKitAttributes এর মাধ্যমে টগলযোগ্য।
  • স্থায়ী স্টোরেজ: নেটওয়ার্ক কল এখনও স্বীকার না করা হলেও ডিলিট এবং পঠিত অবস্থা একটি প্রসেস রিস্টার্টের পরেও টিকে থাকে।
  • সম্পূর্ণ কাস্টম লেআউটের জন্য একটি উন্মুক্ত PushwooshInboxCell বেস ক্লাস।

সার্ভার চুক্তি অপরিবর্তিত — একই Pushwoosh ইনবক্স ব্যাকএন্ড, পেলোড, এবং ড্যাশবোর্ড টুলিং আগের মতোই কাজ করে।

আপনার ইন্টিগ্রেশন পদ্ধতি বেছে নিন

Anchor link to

একটি মেসেজ থেকে কাস্টম ডেটা পড়ুন

Anchor link to

একটি পুশকে ইনবক্সে প্রদর্শিত করতে, Messages API createMessage রিকোয়েস্টে অবশ্যই inbox_image, inbox_date, বা inbox_days অন্তর্ভুক্ত থাকতে হবে — এই ফিল্ডগুলির মধ্যে একটি ছাড়া পুশটি একটি সাধারণ নোটিফিকেশন হিসাবে ডেলিভার করা হয় এবং ইনবক্স ফিডে পৌঁছায় না। ফ্রি-ফর্ম কাস্টম ডেটা data কী-এর অধীনে যায়, যা SDK ক্লায়েন্টকে u প্যারামিটার হিসাবে ডেলিভার করে:

POST https://api.pushwoosh.com/json/1.3/createMessage
{
"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 স্বয়ংক্রিয়ভাবে ক্যাপশনযুক্ত এবং ক্লাসিক সেলগুলির ভিতরে সেগুলি রেন্ডার করে:

POST https://api.pushwoosh.com/json/1.3/createMessage
{
"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]
}]
}
}

প্রতিটি বোতাম অবজেক্টের এই ফিল্ডগুলি রয়েছে:

FieldTypeWhen
titlestringপ্রয়োজনীয়। দৃশ্যমান বোতামের লেবেল।
urlstringএকটি খালি নয় এমন পার্সযোগ্য URL একটি openURL অ্যাকশন তৈরি করে। আপনার ডেলিগেট এটিকে দমন না করলে SDK এটিকে UIApplication.shared.open এর মাধ্যমে খোলে।
actionstringসুস্পষ্ট অ্যাকশন টোকেন: dismiss (ফিড থেকে মেসেজটি সরিয়ে দেয়), markRead (মেসেজটি পঠিত হিসাবে চিহ্নিত করে), বা custom (হোস্ট-হ্যান্ডেলড)। কেস-ইনসেনসিটিভ।
Anything elseanyযখন action হয় custom, তখন title এবং action ছাড়া বোতাম অবজেক্টের প্রতিটি কী আপনার ডেলিগেটের কাছে কাস্টম পেলোড হিসাবে ফরোয়ার্ড করা হয় — মার্কেটারের সাথে একটি কী-তে সম্মত হন (যেমন tag) এবং তার উপর ভিত্তি করে ডিসপ্যাচ করুন।

রেজোলিউশন অগ্রাধিকার: প্রথমে সুস্পষ্ট action টোকেন, তারপর url যদি খালি না থাকে, অন্যথায় বোতামটি সম্পূর্ণ পেলোড (মাইনাস title এবং action) বহন করে custom এর অধীনে পড়ে।

আপনার ডেলিগেট থেকে ট্যাপগুলি ইন্টারসেপ্ট করুন। button.action প্রপার্টিটি হল টাইপড PushwooshInboxButtonAction enum:

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
}
}
}