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

Pushwoosh InboxKit iOS সেট আপ করা

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

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

InboxKit ফিড ব্যানার, ক্যাপশনযুক্ত, ক্লাসিক, ক্যারোসেল, ভিডিও এবং Apple Wallet কার্ড দেখাচ্ছে

ডিফল্ট InboxKit ফিড ব্যানার, ক্যাপশনযুক্ত, ক্লাসিক, ক্যারোসেল, ভিডিও, এবং Apple Wallet কার্ড সহ।

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

Anchor link to

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

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

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

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

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

Anchor link to

কার্ডের প্রকার

Anchor link to

InboxKit প্রতিটি মেসেজের জন্য একটি সেল লেআউট বেছে নেয়। ডিফল্ট রিজলভার পুশ পেলোড থেকে displayType পড়ে — এটি data অবজেক্টের ভিতরে রাখুন, যা SDK actionParams-এর অধীনে সরবরাহ করে। যখন displayType অনুপস্থিত থাকে, তখন রিজলভার একটি হিউরিস্টিকের উপর নির্ভর করে: ছবি + কোনো শিরোনাম নেই → ব্যানার, ছবি + শিরোনাম + বডি → ক্যাপশনযুক্ত, অন্যথায় ক্লাসিক। কোড থেকে পুরো ফিডের জন্য একটি লেআউট জোর করে সেট করতে, attributes.forceCellKind সেট করুন।

প্রতিটি রিচ লেআউট সুন্দরভাবে ডিগ্রেড করে: যদি একটি বাধ্যতামূলক ফিল্ড অনুপস্থিত বা ভুল ফর্ম্যাটে থাকে, কার্ডটি একটি খালি প্লেসহোল্ডার রেন্ডার করার পরিবর্তে classic-এ ফিরে আসে (এবং কারণ সহ একটি WARN লগ করা হয়)। classic হল টার্মিনাল ফলব্যাক এবং মেসেজ যা বহন করে তাই রেন্ডার করে; মেসেজ এডিটর তার শিরোনাম, বডি এবং আইকন পূরণ করবে বলে আশা করা হয়।

displayTypeলেআউটপ্রয়োজনীয় পেলোড ফিল্ডএতে ডিগ্রেড হয়
bannerফুল-ব্লিড ছবি, কোনো টেক্সট নেইছবি (inbox_image বা data.image)ছবি না থাকলে classic
captionedউপরে ছবি, নিচে শিরোনাম + বডিছবি (inbox_image বা data.image), মেসেজের title এবং contentছবি, শিরোনাম বা বডি অনুপস্থিত থাকলে classic
classicরঙিন প্রাথমিক অ্যাভাটার + শিরোনাম + বডি— (শিরোনাম, বডি এবং আইকন প্রত্যাশিত)—
carouselসোয়াইপযোগ্য একাধিক ছবির গ্যালারিমেসেজের title এবং content, data.carousel (১–৫টি স্লাইড)কোনো স্লাইড বা শিরোনাম/বডি না থাকলে classic
videoপ্লে ব্যাজ সহ পোস্টার, ট্যাপ করলে ফুল-স্ক্রিন প্লেয়ারdata.video (url + ঐচ্ছিক poster)কোনো ডেসক্রিপ্টর না থাকলে classic
wallet”Add to Apple Wallet” বোতাম (শুধুমাত্র iOS)data.wallet (.pkpass URL)কোনো পাস URL না থাকলে classic
InboxKit ব্যানার কার্ড
ব্যানার কার্ড
InboxKit ক্যাপশনযুক্ত কার্ড
ক্যাপশনযুক্ত কার্ড
InboxKit ক্লাসিক কার্ড
ক্লাসিক কার্ড
InboxKit ক্যারোসেল কার্ড
ক্যারোসেল কার্ড
InboxKit ভিডিও কার্ড
ভিডিও কার্ড
InboxKit Apple Wallet কার্ড
Apple Wallet কার্ড

ব্যানার, ক্যাপশনযুক্ত এবং ক্লাসিক কার্ডগুলি স্ট্যান্ডার্ড মেসেজ ফিল্ড (ছবি, শিরোনাম, বডি) এবং ঐচ্ছিক buttons অ্যারে দ্বারা চালিত হয় — ইনলাইন CTA বোতাম যোগ করুন দেখুন। ক্যারোসেল, ভিডিও এবং Apple Wallet কার্ডগুলি data-এর ভিতরে অতিরিক্ত স্ট্রাকচার্ড ডেটা বহন করে, যা নিচে নথিভুক্ত করা হয়েছে।

ক্যারোসেল কার্ড

Anchor link to

একটি ক্যারোসেল একটি একক মেসেজ থেকে বেশ কয়েকটি ছবি রেন্ডার করে — একটি সোয়াইপযোগ্য গ্যালারি যেখানে ঐচ্ছিক প্রতি-স্লাইড ক্যাপশন এবং ট্যাপ ডেস্টিনেশন থাকে। স্লাইডগুলি data.carousel-এ থাকে। প্রতিটি স্লাইডের জন্য একটি image প্রয়োজন; title (ক্যাপশন ওভারলে) এবং url (ট্যাপ করলে খোলা ডিপ লিঙ্ক) ঐচ্ছিক। ছবি ছাড়া একটি স্লাইড বাদ দেওয়া হয়; url ছাড়া একটি স্লাইডে ট্যাপ করলে মেসেজের ডিফল্ট রো অ্যাকশনে চলে যায়। সর্বাধিক ৫টি স্লাইড দেখানো হয় — অতিরিক্ত স্লাইডগুলি বাদ দেওয়া হয় (ছবি ছাড়া একটি স্লাইড একটি স্থান ব্যবহার করে না)। এই লেআউটের জন্য মেসেজের title এবং content বাধ্যতামূলক; এগুলি ছাড়া কার্ডটি classic-এ ডিগ্রেড হয়।

POST https://api.pushwoosh.com/json/1.3/createMessage
{
"request": {
"application": "XXXXX-XXXXX",
"auth": "API_TOKEN",
"notifications": [{
"send_date": "now",
"ios_title": "New arrivals",
"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" },
{ "image": "https://cdn.example.com/inbox/3.jpg" }
]
},
"platforms": [1]
}]
}
}

ভিডিও কার্ড

Anchor link to

একটি ভিডিও কার্ড একটি প্লে ব্যাজ সহ একটি পোস্টার ছবি দেখায়; এটিতে ট্যাপ করলে একটি ফুল-স্ক্রিন প্লেয়ার খোলে (সাইলেন্ট সুইচ চালু থাকলেও সাউন্ড অন থাকে)। ডেসক্রিপ্টরটি data.video-তে থাকে: url প্রয়োজনীয় এবং এটি একটি http/https স্ট্রিম বা ফাইল হতে হবে; poster একটি ঐচ্ছিক প্রিভিউ ছবি।

POST https://api.pushwoosh.com/json/1.3/createMessage
{
"request": {
"application": "XXXXX-XXXXX",
"auth": "API_TOKEN",
"notifications": [{
"send_date": "now",
"ios_title": "Watch the reveal",
"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": [1]
}]
}
}

Apple Wallet কার্ড

Anchor link to

Apple Wallet কার্ড একটি ঐচ্ছিক হিরো ছবি, শিরোনাম এবং বডি দেখায় যা অফিসিয়াল Add to Apple Wallet বোতামের উপরে থাকে। বোতামটি ট্যাপ করলে .pkpass ডাউনলোড হয় এবং সিস্টেমের অ্যাড-পাস শিটটি উপস্থাপন করে। এটি কুপন, লয়ালটি কার্ড, টিকিট বা বোর্ডিং পাস সরাসরি ইনবক্স থেকে সরবরাহ করতে ব্যবহার করুন। কার্ডটি শুধুমাত্র iOS / Mac Catalyst-এর জন্য — অন্যান্য প্ল্যাটফর্মে মেসেজটি একটি ক্লাসিক কার্ড হিসাবে রেন্ডার হয়।

পাস URL data.wallet-এ থাকে, হয় একটি বেয়ার স্ট্রিং হিসাবে অথবা একটি pass ফিল্ড সহ একটি অবজেক্ট হিসাবে। একটি ঐচ্ছিক data.image হিরো ছবিটি যোগ করে। যখন কোনো পাস URL না থাকে বা ডিভাইস পাস যোগ করতে পারে না তখন বোতামটি স্বয়ংক্রিয়ভাবে নিজেকে লুকিয়ে রাখে।

POST https://api.pushwoosh.com/json/1.3/createMessage
{
"request": {
"application": "XXXXX-XXXXX",
"auth": "API_TOKEN",
"notifications": [{
"send_date": "now",
"ios_title": "Your loyalty card is ready",
"content": "Add it to Apple Wallet in one tap",
"inbox_days": 7,
"data": {
"displayType": "wallet",
"image": "https://cdn.example.com/inbox/loyalty.png",
"wallet": "https://passes.example.com/v1/passes/pass.com.example.loyalty/abc123?token=…"
},
"platforms": [1]
}]
}
}

ফলাফলটি আপনার ডেলিগেটের কাছে রিপোর্ট করা হয়:

extension MyInboxHost: PushwooshInboxKitDelegate {
func inboxKit(_ vc: PushwooshInboxKitViewController,
didAddWalletPassFor message: PWInboxMessageProtocol) {
// পাসটি এখন ব্যবহারকারীর Wallet-এ আছে — আপনি চাইলে একটি কনফার্মেশন দেখাতে পারেন।
}
func inboxKit(_ vc: PushwooshInboxKitViewController,
didFailToAddWalletPassFor message: PWInboxMessageProtocol,
error: Error?) {
// ডাউনলোড ব্যর্থ হয়েছে — একটি রিট্রাই, লগ ইত্যাদি দেখান।
}
}

উভয় কলব্যাকই ঐচ্ছিক (এগুলিতে ডিফল্ট খালি ইমপ্লিমেন্টেশন থাকে)। একজন ব্যবহারকারী সিস্টেম শিট বাতিল করলে তা সাফল্য বা ব্যর্থতা কোনোটিই নয়, তাই সেক্ষেত্রে কোনো কলব্যাক ফায়ার হয় না।

অ্যাক্সেসিবিলিটি

Anchor link to

InboxKit সেলগুলি বক্সের বাইরেই VoiceOver-এর জন্য প্রস্তুত। ব্যানার, ক্যাপশনযুক্ত এবং ক্লাসিক কার্ডগুলি তাদের শিরোনাম, বডি এবং তারিখ অন্তর্নিহিত লেবেলের মাধ্যমে প্রকাশ করে এবং ইনলাইন CTA বোতামগুলি তাদের নিজস্ব শিরোনাম পড়ে। রিচ কার্ডগুলি সুস্পষ্ট সেমান্টিকস যোগ করে:

  • ভিডিও — পোস্টারটি “Play video” লেবেলযুক্ত একটি একক বোতাম উপাদান হিসাবে প্রকাশ করা হয় (traits .button + .startsMediaSession), তাই VoiceOver এটিকে একটি সাধারণ ছবির পরিবর্তে একটি মিডিয়া নিয়ন্ত্রণ হিসাবে ঘোষণা করে।
  • ক্যারোসেল — প্রতিটি স্লাইড একটি বোতাম উপাদান যার অ্যাক্সেসিবিলিটি লেবেল হল স্লাইডের ক্যাপশন, অথবা যখন কোনো ক্যাপশন না থাকে তখন “Slide”। পেজ ইন্ডিকেটর বর্তমান অবস্থানকে “n of total” হিসাবে ঘোষণা করে।
  • Apple Wallet — Add to Apple Wallet বোতামটি Apple-এর স্ট্যান্ডার্ড PKAddPassButton, যা তার নিজস্ব স্থানীয়কৃত VoiceOver লেবেল বহন করে।

UI টেস্টিং এবং অটোমেশনের জন্য, দুটি স্থিতিশীল accessibilityIdentifier সেট করা আছে: ভিডিও পোস্টারে inboxkit.video.play এবং Wallet বোতামে inboxkit.wallet.add।

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

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": {
"displayType": "captioned",
"promo_id": "SUMMER2026",
"screen": "promo_details"
},
"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 }
// কাস্টম `data` অবজেক্টটি "u" কী-এর অধীনে আসে —
// হয় একটি নেস্টেড ডিকশনারি হিসাবে অথবা একটি JSON-এনকোডেড স্ট্রিং হিসাবে,
// পেলোডটি আপস্ট্রিমে কীভাবে তৈরি হয়েছিল তার উপর নির্ভর করে।
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 // আমরা ট্যাপটি হ্যান্ডেল করেছি; SDK-এর ডিফল্ট অ্যাকশন চালানো উচিত নয়
}
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": {
"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": [1]
}]
}
}

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

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

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

আপনার ডেলিগেট থেকে ট্যাপগুলি ইন্টারসেপ্ট করুন। 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):
// ডিফল্ট আচরণ ঠিক আছে — SDK-কে URL খুলতে দিন।
return true
case .dismiss, .markRead:
// SDK উভয়ই হ্যান্ডেল করে। আপনি যদি ওভাররাইড করতে চান তবে false রিটার্ন করুন।
return true
case .custom(let payload):
// মার্কেটার-ডিফাইন্ড কাস্টম বোতাম। আপনি যে কী-তে সম্মত হয়েছেন তার উপর ভিত্তি করে ডিসপ্যাচ করুন।
if let tag = payload["tag"] as? String {
switch tag {
case "save_promo":
saveCurrentPromoLocally(message: message)
default:
break
}
}
return true // কাস্টমের জন্য উপেক্ষা করা হয়েছে — SDK এখানে কখনও ডিফল্ট অ্যাকশন চালায় না
}
}
}