Notification Service Extension হল একটি iOS এক্সটেনশন যা ব্যবহারকারীকে দেখানোর আগে push বিজ্ঞপ্তিকে আটকায় এবং বিষয়বস্তু পরিবর্তনের অনুমতি দেয়। এক্সটেনশন এনক্রিপ্টেড ডেটা ডিক্রিপ্ট করতে পারে, মিডিয়া অ্যাটাচমেন্ট ডাউনলোড করতে পারে, টেক্সট পরিবর্তন করতে পারে বা কাস্টম ফিল্ড যোগ করতে পারে। Apple Developer, 2025 অনুযায়ী, Notification Service Extension-এর ব্যাকগ্রাউন্ডে কাজ সম্পন্ন করার জন্য 30 সেকেন্ড পর্যন্ত সময় আছে।
মূল বিষয়
Notification Service Extension হল iOS-এর একটি অ্যাপ এক্সটেনশন যা push বিজ্ঞপ্তি প্রদর্শনের আগে চলে। এটি সার্ভারকে ন্যূনতম payload পাঠাতে দেয় যখন এক্সটেনশন এটি বিষয়বস্তু দিয়ে সমৃদ্ধ করে: ইমেজ ডাউনলোড করা, ডেটা ডিক্রিপ্ট করা, টেক্সট প্রতিস্থাপন করা। ব্যবহারকারী ইতিমধ্যে প্রক্রিয়াকৃত বিজ্ঞপ্তি দেখেন।
যখন iOS একটি push বিজ্ঞপ্তি পায়, সিস্টেম পরীক্ষা করে যে অ্যাপের জন্য কোনো এক্সটেনশন আছে কিনা। যদি এক্সটেনশন নিবন্ধিত থাকে, iOS এটি একটি ব্যাকগ্রাউন্ড প্রক্রিয়ায় শুরু করে এবং didReceive(_:withContentHandler:) মেথডের মাধ্যমে বিজ্ঞপ্তির বিষয়বস্তু পাঠায়। এক্সটেনশন বিষয়বস্তু প্রক্রিয়াকরণ করে এবং পরিবর্তিত বিষয়বস্তু সহ contentHandler কল করে। যদি এক্সটেনশন 30 সেকেন্ডের মধ্যে সম্পন্ন না হয়, সিস্টেম মূল বিজ্ঞপ্তি প্রদর্শন করে।
Service Extension সেই পরিস্থিতিতে প্রয়োজন যেখানে বিজ্ঞপ্তির বিষয়বস্তু ডিভাইসে প্রক্রিয়াকরণের প্রয়োজন। নিরাপদ যোগাযোগ: সার্ভার এনক্রিপ্টেড payload পাঠায়, এক্সটেনশন এটি স্থানীয়ভাবে ডিক্রিপ্ট করে। রিচ মিডিয়া বিজ্ঞপ্তি: সার্ভার একটি ইমেজ URL পাঠায়, এক্সটেনশন এটি ডাউনলোড এবং সংযুক্ত করে। ডায়নামিক স্থানীয়করণ: এক্সটেনশন ডিভাইসের ভাষায় টেক্সট প্রতিস্থাপন করে।
| পরিস্থিতি | এক্সটেনশন ছাড়া | এক্সটেনশন সহ |
|---|---|---|
| ইমেজ | সমর্থিত নয় | ডাউনলোড এবং প্রদর্শিত |
| এনক্রিপশন | সার্ভার কী রাখে | ডিভাইসে ডিক্রিপশন |
| টেক্সট | সার্ভারে হার্ডকোডেড | ডায়নামিক প্রতিস্থাপন |
| বৈধতা | যাচাই করা হয় না | ক্ষতিকারক বিজ্ঞপ্তি বাতিল |
Notification Service Extension সীমিত পরিবেশে কাজ করে। সর্বোচ্চ নির্বাহের সময় 30 সেকেন্ড। এক্সটেনশনের মূল অ্যাপ স্টোরেজে (App Group ছাড়া) অ্যাক্সেস নেই। এক্সটেনশনের আকার 50 MB-তে সীমাবদ্ধ। সময় শেষ হলে, সিস্টেম মূল বিষয়বস্তু সহ contentHandler কল করে এবং সমস্ত পরিবর্তন হারিয়ে যায়।
Xcode-এ, Notification Service Extension যোগ করা হয় Notification Service Extension টাইপের একটি নতুন target তৈরি করে। Xcode একটি টেমপ্লেট NotificationService ক্লাস জেনারেট করে যা UNNotificationServiceExtension থেকে ইনহেরিট করে, দুটি মেথড সহ: didReceive এবং serviceExtensionTimeWillExpire।
Xcode-এ, File → New → Target → Notification Service Extension নির্বাচন করুন। একটি নাম লিখুন (যেমন PushNotificationService) এবং Swift ভাষা নির্বাচন করুন। নিশ্চিত করুন যে target মূল অ্যাপে যোগ করা হয়েছে এবং সঠিক স্বাক্ষর রয়েছে। তৈরি হওয়ার পর, NotificationService.swift ক্লাস একটি মৌলিক বাস্তবায়ন সহ জেনারেট হবে।
এক্সটেনশনের Info.plist-এ NSExtension কী থাকে যার উপ-কী NSExtensionPointIdentifier (com.apple.usernotifications.service) এবং NSExtensionPrincipalClass (আপনার কন্ট্রোলারের নাম) থাকে। অতিরিক্তভাবে, এক্সটেনশন সক্রিয়করণ নিয়ম সহ NSExtensionAttributes নির্দিষ্ট করা যেতে পারে। Xcode এই সেটিংস স্বয়ংক্রিয়ভাবে জেনারেট করে।
মৌলিক বাস্তবায়ন didReceive ওভাররাইড করে, বিজ্ঞপ্তির বিষয়বস্তু পরিবর্তন করে এবং contentHandler কল করে। যদি প্রক্রিয়াকরণে অনেক সময় লাগে, serviceExtensionTimeWillExpire কল করা হয়, যেখানে আপনাকে বর্তমান অবস্থা নিয়ে কাজ সম্পন্ন করতে হবে।
import UserNotifications
class NotificationService: UNNotificationServiceExtension {
var contentHandler: ((UNNotificationContent) -> Void)?
var bestAttemptContent: UNMutableNotificationContent?
override func didReceive(
request: UNNotificationRequest,
withContentHandler handler: @escaping (UNNotificationContent) -> Void
) {
contentHandler = handler
bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
if let bestAttemptContent = bestAttemptContent {
bestAttemptContent.title = "[প্রক্রিয়াকৃত] \(bestAttemptContent.title)"
contentHandler?(bestAttemptContent)
}
}
override func serviceExtensionTimeWillExpire() {
if let contentHandler = contentHandler,
let bestAttemptContent = bestAttemptContent {
contentHandler(bestAttemptContent)
}
}
}
Service Extension-এর মূল ব্যবহারগুলির মধ্যে একটি হল ডিভাইসে বিজ্ঞপ্তির বিষয়বস্তু ডিক্রিপ্ট করা। সার্ভার একটি এনক্রিপ্টেড payload পাঠায় এবং এক্সটেনশন এটি Keychain বা App Group-এ সংরক্ষিত কী ব্যবহার করে ডিক্রিপ্ট করে। এটি নিশ্চিত করে যে ট্রান্সমিশনের সময় বিষয়বস্তু আটকানো যায় না।
সার্ভার একটি সিমেট্রিক কী (AES-256) ব্যবহার করে বিজ্ঞপ্তির বডি এনক্রিপ্ট করে। এনক্রিপশন কী ক্লায়েন্ট এবং সার্ভারের মধ্যে পূর্ব-সম্মত হয়। এক্সটেনশন payload-এর data ফিল্ডে এনক্রিপ্টেড স্ট্রিং গ্রহণ করে, এটি ডিক্রিপ্ট করে এবং বিজ্ঞপ্তির ফিল্ডে প্রতিস্থাপন করে। ব্যবহারকারীর কী প্রমাণীকরণের পর Keychain থেকে প্রাপ্ত করা যেতে পারে।
override func didReceive(
request: UNNotificationRequest,
withContentHandler handler: @escaping (UNNotificationContent) -> Void
) {
guard let content = request.content.mutableCopy()
as? UNMutableNotificationContent else {
handler(request.content)
return
}
guard let encryptedData = content.userInfo["encrypted_data"]
as? String else {
handler(content)
return
}
let decrypted = CryptoService.decrypt(encryptedData)
content.body = decrypted.body
content.title = decrypted.title
handler(content)
}
ডিক্রিপশন কী এক্সটেনশন কোড বা NSUserDefaults-এ সংরক্ষণ করা উচিত নয়। App Group-এর মাধ্যমে অ্যাক্সেস সহ iOS Keychain ব্যবহার করুন যাতে অ্যাপ এবং এক্সটেনশন উভয়ই কী পড়তে পারে। ক্লায়েন্টে কী জেনারেশনের জন্য AES-256-GCM অ্যালগরিদম সহ Security.framework ব্যবহার করুন।
Notification Service Extension-এর সবচেয়ে সাধারণ ব্যবহার হল বিজ্ঞপ্তিতে প্রদর্শনের জন্য ইমেজ, GIF এবং ভিডিও ডাউনলোড করা। সার্ভার একটি মিডিয়া ফাইল URL পাঠায় এবং এক্সটেনশন এটি ডাউনলোড করে, একটি অস্থায়ী ডিরেক্টরিতে সংরক্ষণ করে এবং UNNotificationAttachment তৈরি করে।
এক্সটেনশন বিজ্ঞপ্তি payload ফিল্ড থেকে ইমেজ URL গ্রহণ করে। URLSession ব্যবহার করে, এক্সটেনশন ফাইলটি একটি অস্থায়ী ডিরেক্টরিতে ডাউনলোড করে। ডাউনলোড সম্পন্ন হওয়ার পর, স্থানীয় URL সহ UNNotificationAttachment তৈরি করা হয়। অ্যাটাচমেন্ট পরিবর্তিত বিষয়বস্তুতে পাস করা হয়। iOS স্বয়ংক্রিয়ভাবে স্ট্যান্ডার্ড ইন্টারফেস বা Notification Content Extension-এ ইমেজ প্রদর্শন করে।
private func downloadAndAttachMedia(
content: UNMutableNotificationContent,
mediaUrl: String,
handler: @escaping (UNNotificationContent) -> Void
) {
guard let url = URL(string: mediaUrl) else {
handler(content)
return
}
let task = URLSession.shared.downloadTask(with: url) { localUrl, _, error in
guard let localUrl = localUrl, error == nil else {
handler(content)
return
}
let attachment = try? UNNotificationAttachment(
identifier: "media",
url: localUrl,
options: nil
)
if let attachment = attachment {
content.attachments = [attachment]
}
handler(content)
}
task.resume()
}
iOS বিজ্ঞপ্তিতে প্রদর্শনের জন্য নিম্নলিখিত ফরম্যাট সমর্থন করে: JPEG, PNG, GIF (স্ট্যাটিক), 50 MB পর্যন্ত MPEG-4 ভিডিও। অডিও ফাইলের জন্য, MP3, AAC এবং ALAC সমর্থিত। গুরুত্বপূর্ণ: সমস্ত মিডিয়া ফাইল 30 সেকেন্ডের সীমার মধ্যে ডাউনলোড করতে হবে। বড় ফাইলের জন্য, সার্ভার-সাইড ক্রপিং বা প্রগ্রেসিভ লোডিং সুপারিশ করা হয়।
30 সেকেন্ডের সীমা ব্যবস্থাপনা Notification Service Extension ডেভেলপ করার সময় একটি মূল কাজ। যদি এক্সটেনশন সময়মতো প্রক্রিয়াকরণ সম্পন্ন না করে, সিস্টেম serviceExtensionTimeWillExpire কল করে এবং মূল বিষয়বস্তু প্রদর্শন করে। প্রতিটি ধরনের প্রক্রিয়াকরণের জন্য ফলব্যাক পরিস্থিতি প্রদান করতে হবে।
অগ্রাধিকার অনুযায়ী কাজগুলি ভাগ করুন। প্রথমে গুরুত্বপূর্ণ পরিবর্তন (ডিক্রিপশন, মৌলিক স্থানীয়করণ) সম্পাদন করুন। ঐচ্ছিক উন্নতি (ইমেজ ডাউনলোড, টেক্সট সমৃদ্ধকরণ) পরে করুন। নেটওয়ার্ক অনুরোধের জন্য URLSession টাইমআউট ব্যবহার করুন যাতে সম্পূর্ণ সীমা একটি একক অপারেশনে ব্যয় না হয়।
যদি ইমেজ ডাউনলোড ব্যর্থ হয় বা payload ডিক্রিপশন ত্রুটি ফেরত দেয়, এক্সটেনশনের মূল বিষয়বস্তু সহ contentHandler কল করা উচিত। contentHandler কল না করে এক্সটেনশন কখনও শেষ করবেন না — এটি বিজ্ঞপ্তি হারানোর কারণ হয়। নিরাপদ ফলব্যাক সর্বদা এক্সটেনশন কোডে প্রদান করতে হবে।
override func didReceive(
request: UNNotificationRequest,
withContentHandler handler: @escaping (UNNotificationContent) -> Void
) {
let content = (request.content.mutableCopy()
as? UNMutableNotificationContent) ?? request.content
// গুরুত্বপূর্ণ কাজ: ডিক্রিপশন
var decryptedContent = tryDecryptPayload(content)
// ঐচ্ছিক কাজ: মিডিয়া
guard let mediaUrl = decryptedContent.userInfo["media_url"]
as? String else {
handler(decryptedContent)
return
}
downloadAndAttachMedia(
content: decryptedContent,
mediaUrl: mediaUrl,
handler: handler
)
}
Notification Service Extension পরীক্ষা করতে, Xcode ব্যবহার করুন: এক্সটেনশন target নির্বাচন করুন, সিমুলেটরে চালান এবং টার্মিনাল বা Firebase Console-এর মাধ্যমে push বিজ্ঞপ্তি পাঠান। লগ os_log-এর মাধ্যমে প্রক্রিয়াকরণের প্রতিটি ধাপ রেকর্ড করুন — এটি টাইমিং এবং ডাউনলোড সমস্যা নির্ণয়ে সহায়তা করে।
সচরাচর জিজ্ঞাসিত প্রশ্ন
সিস্টেম serviceExtensionTimeWillExpire কল করে, তারপর মূল বিজ্ঞপ্তি অপরিবর্তিত প্রদর্শন করে। সমস্ত ডাউনলোড করা ফাইল এবং পরিবর্তন বাতিল করা হয়।
হ্যাঁ, যদি আপনি খালি বিষয়বস্তু (খালি ফিল্ড সহ UNNotificationContent) সহ contentHandler কল করেন, বিজ্ঞপ্তি প্রদর্শিত হবে না। এটি স্প্যাম বিজ্ঞপ্তি বা ভুল ডেটা ফিল্টার করতে ব্যবহৃত হয়।
টোকেন বিজ্ঞপ্তি payload-এর userInfo-এ পাস করা যেতে পারে বা App Group-এর মাধ্যমে Keychain থেকে প্রাপ্ত করা যেতে পারে। এক্সটেনশন UserDefaults-এ টোকেন সংরক্ষণের সুপারিশ করা হয় না।
এক্সটেনশনকে মূল অ্যাপের মতো একই ডেভেলপার সার্টিফিকেট দিয়ে স্বাক্ষর করতে হবে। প্রোডাকশনের জন্য, Push Notifications ক্ষমতা সক্ষম সহ প্রোডাকশন সার্টিফিকেট প্রয়োজন।
ডিভাইসটি Xcode-এর সাথে সংযুক্ত করুন, রান স্কিমে এক্সটেনশন target নির্বাচন করুন এবং Firebase Console-এর মাধ্যমে push বিজ্ঞপ্তি পাঠান। এক্সটেনশনে ব্রেকপয়েন্ট মূল অ্যাপের মতোই কাজ করে।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন