Notification Extension হল একটি iOS মেকানিজম যা পুশ নোটিফিকেশন ব্যবহারকারীকে দেখানোর আগে তার বিষয়বস্তু এবং চেহারা পরিবর্তন করার অনুমতি দেয়। এক্সটেনশনগুলি অপারেটিং সিস্টেমের পাশে একটি পৃথক প্রক্রিয়ায় কাজ করে: UNNotificationServiceExtension ইনকামিং কন্টেন্ট প্রক্রিয়া করে, যখন UNNotificationContentExtension ইন্টারফেস পরিচালনা করে। Apple Developer Documentation, 2026 অনুসারে, Service Extension নোটিফিকেশন দেখানোর আগে কাজ সম্পাদনের জন্য 30 সেকেন্ড পর্যন্ত সময় পায়। এই সীমাবদ্ধতা অ্যাটাচমেন্ট ডাউনলোড বা ডেটা ডিক্রিপ্ট করার সময় গুরুত্বপূর্ণ।
মূল পয়েন্ট
Notification Extension হল একটি iOS সফ্টওয়্যার উপাদান যা পুশ নোটিফিকেশনের মানক আচরণকে কন্টেন্ট পরিবর্তন এবং ইন্টারফেস কাস্টমাইজ করার ক্ষমতা যোগ করে প্রসারিত করে। সাধারণ নোটিফিকেশনের বিপরীতে যা সিস্টেম দ্বারা মানক বিন্যাসে প্রদর্শিত হয়, এক্সটেনশনগুলি ডেভেলপারকে দেখানোর আগে কন্টেন্টকে প্রভাবিত করতে এবং একটি অনন্য ইউজার ইন্টারফেস তৈরি করতে দেয়।
Apple বিভিন্ন উদ্দেশ্যে দুই ধরনের Notification Extension প্রদান করে: UNNotificationServiceExtension ইনকামিং পেলোড প্রসেসিং পরিচালনা করে, যখন UNNotificationContentExtension প্রদর্শন পরিচালনা করে। Service Extension নোটিফিকেশন দেখানোর আগে চলে এবং Apple Developer Documentation অনুসারে 30 সেকেন্ড পর্যন্ত সীমিত নির্বাহ সময় থাকে। Content Extension ব্যবহারকারী নোটিফিকেশনের সাথে ইন্টারঅ্যাক্ট করার পরে সক্রিয় হয় এবং একটি কাস্টম ভিউ প্রদর্শন করে।
একটি মানক iOS পুশ নোটিফিকেশন JSON পেলোডের alert, title এবং subtitle ফিল্ডের ভিত্তিতে সিস্টেম দ্বারা স্বয়ংক্রিয়ভাবে প্রদর্শিত হয়। Notification Extension নিয়ন্ত্রণ আটকায়: Service Extension কাঁচা পেলোড গ্রহণ করে, তা পরিবর্তন করে এবং প্রদর্শনের জন্য সিস্টেমে পাঠায়। Content Extension মানক ব্যানারকে যেকোনো নিয়ন্ত্রণ উপাদান সহ একটি কাস্টম ইন্টারফেস দিয়ে প্রতিস্থাপন করে।
যখন ডিভাইস mutable-content: 1 কী সহ একটি পুশ নোটিফিকেশন গ্রহণ করে, সিস্টেম একটি পৃথক প্রক্রিয়ায় Service Extension চালু করে। এক্সটেনশন প্রক্রিয়াটি মূল অ্যাপ্লিকেশন থেকে বিচ্ছিন্ন এবং 50 MB মেমরি সীমা সহ নিজস্ব স্যান্ডবক্স রয়েছে। প্রসেসিং সম্পূর্ণ হওয়ার পরে, এক্সটেনশন completion handler কল করে, পরিবর্তিত UNNotificationContent সিস্টেমে প্রদর্শনের জন্য পাঠায়।
UNNotificationServiceExtension ব্যবহারকারীকে দেখানোর আগে প্রোগ্রামেটিকভাবে পুশ নোটিফিকেশন পরিবর্তনের জন্য প্রাথমিক টুল। এক্সটেনশন স্বয়ংক্রিয়ভাবে সক্রিয় হয় যখন এমন একটি নোটিফিকেশন পাওয়া যায় যার পেলোডে mutable-content: 1 ফ্ল্যাগ সেট থাকে। 30 সেকেন্ডের মধ্যে, এক্সটেনশন একটি মিডিয়া অ্যাটাচমেন্ট ডাউনলোড করতে, টেক্সট পরিবর্তন করতে, এনক্রিপ্টেড ডেটা ডিক্রিপ্ট করতে বা কন্টেন্ট সমৃদ্ধ করতে পারে।
এক্সটেনশন UNNotificationServiceExtension প্রোটোকল থেকে দুটি মূল মেথড বাস্তবায়ন করে। didReceive মেথড কাঁচা UNNotificationRequest সহ ইনকামিং অনুরোধ গ্রহণ করে এবং নতুন UNNotificationContent-এর সাথে completion handler-এর মাধ্যমে পরিবর্তনের অনুমতি দেয়। serviceExtensionTimeWillExpire মেথড টাইমআউটের এক সেকেন্ড আগে সিস্টেম দ্বারা কল করা হয় — এতে প্রসেসিং সম্পূর্ণ করতে হয় এবং বর্তমান (সম্ভবত আংশিক) ফলাফল পাঠাতে হয়।
একটি দৃশ্যকল্প বিবেচনা করুন যেখানে সার্ভার একটি কাস্টম ফিল্ডে ছবির URL সহ পুশ পাঠায়। Service Extension এই ছবিটি নেটওয়ার্কের মাধ্যমে ডাউনলোড করে, UNNotificationAttachment তৈরি করে এবং কন্টেন্টে যোগ করে। UNNotificationAttachment একটি স্থানীয় ছবি, ভিডিও বা অডিও ফাইল গ্রহণ করে এবং স্বয়ংক্রিয়ভাবে এটি এক্সটেনশনের স্যান্ডবক্সে কপি করে। অ্যাটাচমেন্ট তৈরি করার পরে, এক্সটেনশন আপডেটেড কন্টেন্ট সিস্টেমে পাঠায়।
class NotificationService: UNNotificationServiceExtension {
override func didReceive(_ request: UNNotificationRequest,
withContentHandler contentHandler:
@escaping (UNNotificationContent) -> Void) {
let userInfo = request.content.userInfo
guard let imageURL = URL(string: userInfo["image-url"] as! String)
else { contentHandler(request.content); return }
let attachment = try! UNNotificationAttachment(
identifier: "image", url: imageURL,
options: [UNNotificationAttachmentOptionsTypeHintKey: "jpg"])
let modifiedContent = request.content.mutableCopy()
as! UNMutableNotificationContent
modifiedContent.attachments = [attachment]
contentHandler(modifiedContent)
}
override func serviceExtensionTimeWillExpire() {
contentHandler?(bestAttemptContent ?? request.content)
}
}
যখন একই অ্যাটাচমেন্ট সহ নোটিফিকেশন ঘন ঘন পাঠানো হয়, তখন ডাউনলোড করা ফাইলগুলি ডিভাইসে ক্যাশ করার পরামর্শ দেওয়া হয়। FileManager এক্সটেনশনের ক্যাশ ডিরেক্টরিতে অ্যাক্সেস প্রদান করে, যা লঞ্চের মধ্যে স্থায়ী হয়। এটি পরবর্তী নোটিফিকেশনের প্রসেসিং সময় কমায় এবং নেটওয়ার্ক লোড হ্রাস করে। Apple-এর মতে, ক্যাশিং প্রসেসিং সময় সম্পূর্ণ ডাউনলোডের পরিবর্তে 2–5 সেকেন্ডে কমাতে পারে।
UNNotificationContentExtension মানক নোটিফিকেশন ব্যানারকে Interface Builder বা SwiftUI-এ তৈরি কাস্টম ইন্টারফেস দিয়ে প্রতিস্থাপন করার অনুমতি দেয়। এক্সটেনশন সক্রিয় হয় যখন ব্যবহারকারী নোটিফিকেশনে একটি ক্রিয়া সম্পাদন করে: ট্যাপ করা, নিচে সোয়াইপ করা বা 3D Touch। Content Extension ইতিমধ্যে Service Extension দ্বারা প্রক্রিয়া করা কন্টেন্ট গ্রহণ করে এবং একটি কাস্টম ভিউতে প্রদর্শন করে।
প্রতিটি Content Extension Info.plist-এর মাধ্যমে এক বা একাধিক নোটিফিকেশন ক্যাটাগরির সাথে সংযুক্ত থাকে। ক্যাটাগরি সার্ভারে APNS পেলোডের category ফিল্ড দ্বারা নির্ধারিত হয়। সিস্টেম প্রাপ্ত নোটিফিকেশনের ক্যাটাগরির ভিত্তিতে স্বয়ংক্রিয়ভাবে উপযুক্ত এক্সটেনশন নির্বাচন করে। ইন্টারফেস মানক UIKit উপাদান বা SwiftUI View ব্যবহার করে storyboard-এর মাধ্যমে তৈরি করা হয়।
Content Extension UNNotificationAction-এ সংজ্ঞায়িত কাস্টম বাটন এবং ট্যাপ হ্যান্ডলার সমর্থন করে। UNNotificationAction ক্যাটাগরি রেজিস্ট্রেশন পর্যায়ে তৈরি করা হয় এবং UNTextInputNotificationAction-এর মাধ্যমে টেক্সট ইনপুট সমর্থন করতে পারে। যখন ব্যবহারকারী একটি বাটন চাপে, এক্সটেনশন কর্ম শনাক্তকারীর সাথে didReceive কলব্যাক গ্রহণ করে এবং সংশ্লিষ্ট লজিক নির্বাহ করতে পারে — URL খোলা, সার্ভারে অনুরোধ পাঠানো বা ইন্টারফেস আপডেট করা।
Content Extension নিজস্ব রান লুপ এবং প্রায় 50 MB মেমরি সীমা সহ একটি বিচ্ছিন্ন প্রক্রিয়ায় কাজ করে। এক্সটেনশনের কার্যক্ষমতা গুরুত্বপূর্ণ কারণ সিস্টেম ওয়াচডগ সীমা অতিক্রম করলে প্রক্রিয়া শেষ করে। Content Extension-এর ভিতরে ভারী গণনা, বড় ছবি লোড এবং দীর্ঘ নেটওয়ার্ক অনুরোধ এড়ানোর পরামর্শ দেওয়া হয়।
UNNotificationAttachment হল একটি অবজেক্ট যা পুশ নোটিফিকেশনে একটি মিডিয়া ফাইল যোগ করে: ছবি, ভিডিও, অডিও বা GIF। অ্যাটাচমেন্ট একটি স্থানীয় ফাইল URL থেকে তৈরি করা হয় যা এক্সটেনশনের স্যান্ডবক্সে থাকা আবশ্যক। অ্যাটাচমেন্টের সর্বোচ্চ আকার 10 MB-এর বেশি হওয়া উচিত নয়, অন্যথায় সিস্টেম এটি তৈরি করার সময় প্রত্যাখ্যান করবে।
Apple মিডিয়া অ্যাটাচমেন্টের জন্য সীমিত ফরম্যাট সমর্থন করে। ছবি — JPEG, PNG, GIF (অ্যানিমেটেড সহ), TIFF। ভিডিও — MPEG, MP4, MOV সর্বোচ্চ 30 সেকেন্ড সময়সীমা সহ। অডিও — MP3, AAC, WAV, CAF। প্রতিটি ফরম্যাটের জন্য UNNotificationAttachmentOptionsTypeHintKey-এর মাধ্যমে টাইপ নির্দিষ্ট করা যায়, যা সিস্টেমকে ফাইল সঠিকভাবে প্রক্রিয়া করতে সাহায্য করে।
যেহেতু পুশ পেলোডে শুধুমাত্র URL থাকে, ফাইল নিজে নয়, অ্যাটাচমেন্ট ডাউনলোড Service Extension-এর ভিতরে করতে হবে। সর্বোচ্চ ডাউনলোড সময় 30 সেকেন্ডে সীমাবদ্ধ, তাই ন্যূনতম সেটিংস সহ URLSession ব্যবহার এবং দুর্বল সিগন্যালে ডাউনলোড অক্ষম করার পরামর্শ দেওয়া হয়। যদি অ্যাটাচমেন্ট সময়মতো লোড না হয়, নোটিফিকেশন মিডিয়া ছাড়া প্রদর্শিত হয় — এটি ডিফল্ট সিস্টেম আচরণ।
আসুন একটি সম্পূর্ণ Notification Extension উদাহরণ দেখি যা একটি ছবি ডাউনলোড করে, সংরক্ষণ করে এবং নোটিফিকেশনে যোগ করে। NotificationService UNNotificationServiceExtension থেকে ইনহেরিট করে এবং didReceive মেথড ওভাররাইড করে। উদাহরণটি ঐচ্ছিক ফিল্ড পরিচালনা, অ্যাটাচমেন্ট তৈরি এবং পরিবর্তিত কন্টেন্ট সহ completion handler কল করা দেখায়।
import UserNotifications
class NotificationService: UNNotificationServiceExtension {
var contentHandler: ((UNNotificationContent) -> Void)?
var bestAttemptContent: UNMutableNotificationContent?
override func didReceive(
_ request: UNNotificationRequest,
withContentHandler contentHandler:
@escaping (UNNotificationContent) -> Void
) {
self.contentHandler = contentHandler
self.bestAttemptContent =
(request.content.mutableCopy()
as! UNMutableNotificationContent)
guard let attachmentURLString =
bestAttemptContent?.userInfo["attachment-url"] as? String,
let url = URL(string: attachmentURLString)
else {
contentHandler(request.content)
return
}
URLSession.shared.downloadTask(with: url) {
[weak self] localURL, _, error in
guard let localURL = localURL, error == nil
else {
contentHandler(request.content)
return
}
let attachment = try! UNNotificationAttachment(
identifier: "media", url: localURL)
self?.bestAttemptContent?.attachments = [attachment]
contentHandler(self?.bestAttemptContent
?? request.content)
}.resume()
}
override func serviceExtensionTimeWillExpire() {
if let content = bestAttemptContent {
contentHandler?(content)
}
}
}
এক্সটেনশন সঠিকভাবে কাজ করার জন্য, Info.plist-এ নোটিফিকেশন ক্যাটাগরি রেজিস্টার করা প্রয়োজন। NSExtensionPointIdentifier কী Service Extension-এর জন্য com.apple.usernotifications.service বা Content Extension-এর জন্য com.apple.usernotifications.content-এ সেট করা হয়। ক্যাটাগরিগুলি AppDelegate-এ UNUserNotificationCenter-এর মাধ্যমে অ্যাপ্লিকেশন লঞ্চের সময় নির্ধারণ করা হয়, এবং এক্সটেনশন শুধুমাত্র পেলোডে মিলে যাওয়া ক্যাটাগরি সহ নোটিফিকেশনের জন্য সক্রিয় হয়।
সচরাচর জিজ্ঞাসা
Service Extension নোটিফিকেশন দেখানোর আগে কন্টেন্ট পরিবর্তন করে — মিডিয়া যোগ করে, টেক্সট পরিবর্তন করে, ডেটা ডিক্রিপ্ট করে। Content Extension ব্যবহারকারীর ইন্টারঅ্যাকশনের পরে নোটিফিকেশন ইন্টারফেসকে কাস্টম ইন্টারফেস দিয়ে প্রতিস্থাপন করে। Service Extension দেখানোর আগে কাজ করে, Content Extension পরে।
সিস্টেম didReceive-এ কোড নির্বাহের জন্য 30 সেকেন্ড বরাদ্দ করে। যদি প্রসেসিং এই সময়ের মধ্যে সম্পূর্ণ না হয়, serviceExtensionTimeWillExpire কল করা হয়, যেখানে বর্তমান ফলাফল পাঠাতে হয়। অ্যাটাচমেন্ট ডাউনলোড বিবেচনায় 10–15 সেকেন্ডের মধ্যে থাকার পরামর্শ দেওয়া হয়।
হ্যাঁ, iOS 16 থেকে Content Extension-এ SwiftUI সমর্থিত। View-কে UIHostingController-এ মোড়ানো হয় এবং storyboard-এ যোগ করা হয়। তবে, মেমরি সীমার কারণে, SwiftUI শুধুমাত্র ন্যূনতম উপাদান সহ সরল ইন্টারফেসের জন্য ব্যবহার করার পরামর্শ দেওয়া হয়।
ডাউনলোড ত্রুটি বা সময় শেষ হওয়ার ক্ষেত্রে, অ্যাটাচমেন্ট ছাড়া মূল কন্টেন্ট সহ completion handler কল করুন। সিস্টেম নোটিফিকেশন প্রদর্শন করবে মিডিয়া ছাড়া মানক আকারে। রোগ নির্ণয়ের জন্য OSLog-এর মাধ্যমে ত্রুটি লগ করুন, কিন্তু নোটিফিকেশন প্রদর্শন ব্লক করবেন না।
এক্সটেনশন প্রায় 50 MB সীমা সহ একটি বিচ্ছিন্ন প্রক্রিয়ায় কাজ করে। অতিক্রম করলে, সিস্টেম ওয়াচডগের মাধ্যমে প্রক্রিয়া শেষ করে। বড় ফাইল লোড করা, মেমরিতে ছবি সংরক্ষণ এবং URLSession-এর সাথে কাজ করার সময় লিক এড়িয়ে চলুন।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন