Notification Service Extension একটি iOS এক্সটেনশন যা পুশ বিজ্ঞপ্তি পাওয়ার সাথে সাথেই কিন্তু ব্যবহারকারীকে দেখানোর আগেই তা আটকায়। এক্সটেনশনটি এনক্রিপ্টেড পেলোড ডিক্রিপ্ট করতে পারে, মিডিয়া ফাইল ডাউনলোড এবং সংযুক্ত করতে পারে এবং রিয়েল টাইমে বিজ্ঞপ্তির টেক্সট বা শিরোনাম পরিবর্তন করতে পারে। Apple ডেভেলপার ডকুমেন্টেশন (2025) অনুসারে, এক্সটেনশন সক্রিয় করতে সার্ভারকে বিজ্ঞপ্তি অ্যাট্রিবিউটে mutable-content:1 কী পাঠাতে হবে — এটি UNNotificationServiceExtension চালানোর একমাত্র শর্ত।
মূল বিষয়
Notification Service Extension iOS-এ একটি অ্যাপ এক্সটেনশন যা ডিভাইস পাশে আগত পুশ বিজ্ঞপ্তি আটকায় এবং ব্যবহারকারী দেখার আগে এর বিষয়বস্তু পরিবর্তন করতে দেয়। এটি একমাত্র ধরনের বিজ্ঞপ্তি এক্সটেনশন যা প্রদর্শনের পরিবর্তে বিষয়বস্তুর সাথে কাজ করে।
Notification Content Extension থেকে মূল পার্থক্য: Service Extension বিজ্ঞপ্তি দেখানোর আগে কাজ করে এবং শিরোনাম, বডি, সাউন্ড ফাইল এবং সংযুক্তি পরিবর্তন করতে পারে। Content Extension দেখানোর পরে কাজ করে এবং শুধুমাত্র প্রস্তুত বিজ্ঞপ্তির ভিজ্যুয়াল উপস্থাপনা পরিচালনা করে। এই দুটি এক্সটেনশন একসাথে কাজ করতে পারে: Service Extension একটি ছবি ডাউনলোড করে, এবং Content Extension এটি একটি কাস্টম ইন্টারফেসে প্রদর্শন করে।
এক্সটেনশনটি aps অভিধানে mutable-content:1 অ্যাট্রিবিউট সহ পুশ বিজ্ঞপ্তি পাওয়ার পর স্বয়ংক্রিয়ভাবে সক্রিয় হয়। iOS ব্যাকগ্রাউন্ডে এক্সটেনশন চালু করে, এটিকে মূল UNNotificationRequest পাঠায় এবং প্রদর্শনের জন্য পরিবর্তিত সংস্করণের অপেক্ষা করে।
UNNotificationServiceExtension মূল বিষয়বস্তু সহ সম্পূর্ণ UNNotificationRequest গ্রহণ করে। এক্সটেনশনটি UNNotificationContent-এর যেকোনো ক্ষেত্র পরিবর্তন করতে পারে: title, subtitle, body, userInfo, attachments এবং sound। বিজ্ঞপ্তি দেখানোর আগে পরিবর্তনগুলি প্রয়োগ করা হয়।
বিষয়বস্তু ডিক্রিপশন — যদি পুশ বিজ্ঞপ্তিতে এনক্রিপ্টেড পেলোড থাকে, এক্সটেনশনটি প্রদর্শনের আগে এটি ডিক্রিপ্ট করে। মিডিয়া ডাউনলোড — বিজ্ঞপ্তির সাথে একটি ছবি বা ভিডিও সংযুক্ত করা। স্থানীয়করণ — ডিভাইসের আঞ্চলিক সেটিংস অনুযায়ী বিজ্ঞপ্তি টেক্সট অভিযোজিত করা। ডেটা সমৃদ্ধকরণ — স্থানীয় স্টোরেজ বা ক্যাশ থেকে অতিরিক্ত তথ্য যোগ করা।
Apple-এর মতে, অ্যাপগুলির মধ্যে সবচেয়ে সাধারণ পরিস্থিতি হল সমৃদ্ধ মিডিয়া বিজ্ঞপ্তির জন্য ছবি ডাউনলোড। সার্ভার পেলোডে একটি ছবির URL পাঠায়, এক্সটেনশনটি এটি একটি অস্থায়ী ডিরেক্টরিতে ডাউনলোড করে এবং একটি UNNotificationAttachment তৈরি করে, যা সিস্টেম একটি মানক বা কাস্টম ইন্টারফেসে প্রদর্শন করে।
এক্সটেনশনটি সম্পূর্ণরূপে বিজ্ঞপ্তির টেক্সট পুনরায় লিখতে পারে, শিরোনাম প্রতিস্থাপন করতে পারে বা একটি উপশিরোনাম যোগ করতে পারে। উদাহরণস্বরূপ, একটি মেসেঞ্জার অ্যাপ একটি এনক্রিপ্টেড বিজ্ঞপ্তি গ্রহণ করতে পারে, এক্সটেনশনে এটি ডিক্রিপ্ট করতে পারে এবং পাঠযোগ্য টেক্সট প্রদর্শন করতে পারে। অথবা একটি সংবাদ অ্যাপ প্রদর্শনের আগে উপশিরোনামে একটি সংবাদ বিভাগ যোগ করতে পারে।
override func didReceive(
_ request: UNNotificationRequest,
withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void
) {
let content = request.content.mutableCopy()
as! UNMutableNotificationContent
if let imageURL = content.userInfo["media-url"]
as? String {
downloadAndAttach(imageURL: imageURL,
content: content,
handler: contentHandler)
}
}
UNNotificationServiceExtension হল বেস ক্লাস যা থেকে Service Extension উত্তরাধিকার সূত্রে প্রাপ্ত হয়। ক্লাসটি দুটি জীবনচক্র পদ্ধতি সংজ্ঞায়িত করে: didReceive(_:withContentHandler:) — প্রধান প্রক্রিয়াকরণ পদ্ধতি, এবং serviceExtensionTimeWillExpire() — টাইমআউট হ্যান্ডলার।
didReceive(_:withContentHandler:) একটি বিজ্ঞপ্তি প্রাপ্ত হলে কল করা হয়। এক্সটেনশনটি একটি UNNotificationRequest এবং contentHandler ক্লোজার গ্রহণ করে, যা পরিবর্তিত UNMutableNotificationContent-এর সাথে কল করতে হবে। এক্সটেনশনটি contentHandler কল করতে বাধ্য — যদি না করে, iOS টাইমআউট শেষ হওয়ার পরে মূল বিজ্ঞপ্তি দেখাবে।
গুরুত্বপূর্ণ: এক্সটেনশনটি একবারে শুধুমাত্র একটি বিজ্ঞপ্তি প্রক্রিয়া করতে পারে। যদি একসাথে একাধিক বিজ্ঞপ্তি আসে, iOS প্রতিটির জন্য পৃথক এক্সটেনশন ইনস্ট্যান্স তৈরি করে। ক্রমিক প্রক্রিয়াকরণের জন্য গ্লোবাল স্টেট ব্যবহার করা যাবে না।
serviceExtensionTimeWillExpire() সিস্টেম দ্বারা কল করা হয় যখন বাকি নির্বাহের সময় শেষ হতে চলেছে। এই পদ্ধতিতে, আপনাকে অবশ্যই সাথে সাথে contentHandler কল করতে হবে সেই সময়ে প্রস্তুত যেকোনো বিষয়বস্তু সহ — এমনকি যদি মিডিয়া ফাইল ডাউনলোড শেষ না হয়। আপনি যদি এই পদ্ধতিতে contentHandler কল না করেন, iOS মূল বিজ্ঞপ্তি দেখাবে।
এই পদ্ধতিতে ন্যূনতম গ্রহণযোগ্য বিষয়বস্তু সংরক্ষণ করার পরামর্শ দেওয়া হয় — উদাহরণস্বরূপ, টেক্সট এবং শিরোনাম সহ একটি বিজ্ঞপ্তি কিন্তু ছবি ছাড়া যার ডাউনলোড সময়মতো সম্পূর্ণ হয়নি।
UNNotificationAttachment একটি অবজেক্ট যা বিজ্ঞপ্তির সাথে একটি মিডিয়া ফাইল সংযুক্ত করার জন্য এক্সটেনশন দ্বারা তৈরি করা হয়। এক্সটেনশনটি নেটওয়ার্ক থেকে ফাইল ডাউনলোড করে, এটি একটি অস্থায়ী ডিরেক্টরিতে সংরক্ষণ করে এবং বিষয়বস্তুর ধরন উল্লেখ করে একটি UNNotificationAttachment তৈরি করে।
UNNotificationAttachment init(identifier:url:options:) ইনিশিয়ালাইজার ব্যবহার করে তৈরি করা হয়। URL এক্সটেনশনের জন্য অ্যাক্সেসযোগ্য অস্থায়ী ডিরেক্টরিতে একটি স্থানীয় ফাইলের দিকে নির্দেশ করতে হবে। তৈরি করার পরে, সংযুক্তিটি UNMutableNotificationContent-এর attachments অ্যারেতে যোগ করা হয়।
Apple ডাউনলোডের জন্য ব্যাকগ্রাউন্ড কনফিগারেশন সহ URLSession ব্যবহার করার পরামর্শ দেয় — স্ট্যান্ডার্ড URLSession ব্যবহার করলে, ডাউনলোড থ্রেড ব্লক করে এবং 30 সেকেন্ডের সীমা থেকে সময় খরচ করে। ব্যাকগ্রাউন্ড URLSession এক্সটেনশন শেষ হওয়ার পরেও ডাউনলোড চালিয়ে যায় এবং ফলাফলটি পরবর্তী লঞ্চে ব্যবহার করা যেতে পারে।
যদি সার্ভার একটি এনক্রিপ্টেড বিজ্ঞপ্তি পাঠায়, এক্সটেনশনটিকে contentHandler কল করার আগে পেলোড ডিক্রিপ্ট করতে হবে। ডিক্রিপশনে সাধারণত Keychain বা App Group থেকে কী অনুরোধ করা, CommonCrypto-এর মাধ্যমে ডিক্রিপ্ট করা এবং বিজ্ঞপ্তির body বা userInfo প্রতিস্থাপন করা জড়িত। ডিক্রিপশন ত্রুটির ক্ষেত্রে, আপনার মূল বিষয়বস্তু সহ contentHandler কল করা উচিত — যাতে ব্যবহারকারী অন্তত দেখে যে একটি বিজ্ঞপ্তি এসেছে, যদিও অপাঠ্য।
func downloadAndAttach(
imageURL: String,
content: UNMutableNotificationContent,
handler: @escaping (UNNotificationContent) -> Void
) {
let task = URLSession.shared.dataTask(with:
URL(string: imageURL)!) { data, _, _ in
let url = FileManager.default
.temporaryDirectory
.appendingPathComponent("image.jpg")
try? data?.write(to: url)
let attachment = try? UNNotificationAttachment(
identifier: "image", url: url)
content.attachments = [attachment].compactMap { $0 }
handler(content)
}
task.resume()
}
Notification Service Extension কঠোর সময়সীমার মধ্যে কাজ করে। iOS একটি নির্দিষ্ট নির্বাহের সময় বরাদ্দ করে — সক্রিয়করণ থেকে প্রায় 30 সেকেন্ড। যদি এক্সটেনশনটি এই সময়ের মধ্যে contentHandler কল না করে, সিস্টেম জোর করে প্রক্রিয়াটি শেষ করে এবং মূল বিজ্ঞপ্তি অপরিবর্তিত দেখায়।
বহু-স্তরের ফলব্যাক বাস্তবায়নের পরামর্শ দেওয়া হয়: প্রথমে মিডিয়া ডাউনলোড করার চেষ্টা করুন, সফল হলে সম্পূর্ণ বিষয়বস্তু সহ contentHandler কল করুন; ব্যর্থ হলে টেক্সট সহ কিন্তু মিডিয়া ছাড়া contentHandler কল করুন; গুরুতর ত্রুটির ক্ষেত্রে মূল বিষয়বস্তু প্রেরণ করুন। এই পদ্ধতি নিশ্চিত করে যে ব্যবহারকারী সবসময় একটি বিজ্ঞপ্তি দেখবে, ফাঁকা স্ক্রিন নয়।
Apple-এর মতে, টাইমআউটের সবচেয়ে সাধারণ কারণ হল ধীর সংযোগে বড় মিডিয়া ফাইল ডাউনলোড। ঝুঁকি কমাতে, সার্ভারে ছবির আকার অপ্টিমাইজ করার পরামর্শ দেওয়া হয় — পূর্ণ রেজোলিউশনের পরিবর্তে 300 KB পর্যন্ত প্রিভিউ পাঠান। পূর্ণ আকারের ছবি অ্যাপ খোলার সময় ডাউনলোড করা উচিত।
এক্সটেনশন টাইমআউট এবং ত্রুগুলি ট্র্যাক করতে, আপনি ইউনিফাইড লগিং সিস্টেমে ডায়াগনস্টিক বার্তা রেকর্ড করতে os_log ব্যবহার করতে পারেন। যদিও এক্সটেনশনে সরাসরি ফাইল লগিং করা কঠিন, os_log ডেভেলপার ডিভাইসে Console.app-এর মাধ্যমে পারফরম্যান্স বিশ্লেষণের অনুমতি দেয়। Apple প্রতিটি didReceive কলে মেট্রিক্স যোগ করার পরামর্শ দেয় — ডাউনলোড সময়, ফাইলের আকার, অপারেশনের ফলাফল।
override func serviceExtensionTimeWillExpire() {
let fallback = bestEffortContent as?
UNMutableNotificationContent
?? request.content.mutableCopy()
as! UNMutableNotificationContent
contentHandler(fallback)
}
সচরাচর জিজ্ঞাসিত প্রশ্ন
সার্ভার পুশ বিজ্ঞপ্তির aps অভিধানে mutable-content:1 কী যোগ করে। এই প্যারামিটার ছাড়া, সিস্টেম এক্সটেনশন উপেক্ষা করে এবং মানক বিজ্ঞপ্তি দেখায়।
না। mutable-content:1 Service Extension সক্রিয় করার জন্য বাধ্যতামূলক শর্ত। যদি কী অনুপস্থিত বা 0-এ সেট থাকে, এক্সটেনশন কল না করেই বিজ্ঞপ্তি প্রদর্শিত হয়।
iOS জোর করে এক্সটেনশন শেষ করে এবং মূল বিজ্ঞপ্তি অপরিবর্তিত দেখায়। এটি এড়াতে, ন্যূনতম গ্রহণযোগ্য বিষয়বস্তু সহ serviceExtensionTimeWillExpire() বাস্তবায়ন করুন।
App Group (শেয়ার্ড UserDefaults বা ফাইল) বা অ্যাপ এবং এক্সটেনশনের মধ্যে শেয়ার্ড অ্যাক্সেস সহ Keychain-এর মাধ্যমে। বিজ্ঞপ্তি পেলোডে সরাসরি কী পাঠানো নিরাপদ নয়।
প্রতি বিজ্ঞপ্তিতে 4টি সংযুক্তি পর্যন্ত, প্রতিটি 50 MB পর্যন্ত। সংযুক্তির মোট আকার ডাউনলোডের সময়কে প্রভাবিত করে — যত বেশি ফাইল, টাইমআউটের ঝুঁকি তত বেশি।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন