Notification Service Extension — ay isang iOS extension na humaharang sa push notification bago ito ipakita sa user at nagpapahintulot sa pagbabago ng nilalaman. Maaaring i-decrypt ng extension ang naka-encrypt na data, mag-download ng mga media attachment, magbago ng text, o magdagdag ng custom na mga field. Ayon sa Apple Developer, 2025, ang Notification Service Extension ay may hanggang 30 segundo upang gawin ang gawain sa background.
Mga Pangunahing Punto
Notification Service Extension — ay isang app extension sa iOS na tumatakbo bago ipakita ang push notification. Pinapayagan nito ang server na magpadala ng minimal na payload, at ang extension ay magdagdag ng nilalaman: mag-download ng mga larawan, mag-decrypt ng data, magpalit ng text. Nakikita ng user ang nakahanda at naprosesong notification.
Kapag nakatanggap ang iOS ng push notification, sinusuri ng system ang pagkakaroon ng extension para sa application na ito. Kung ang extension ay rehistrado, inilulunsad ito ng iOS sa isang background process at ipinapasa ang nilalaman ng notification sa pamamagitan ng didReceive(_:withContentHandler:) method. Pinoproseso ng extension ang nilalaman at tinatawagan ang contentHandler na may binagong nilalaman. Kung hindi matapos ang extension sa loob ng 30 segundo, ipapakita ng system ang orihinal na notification.
Kinakailangan ang Service Extension sa mga senaryo kung saan ang nilalaman ng notification ay nangangailangan ng pagproseso sa device. Ligtas na komunikasyon: ang server ay nagpapadala ng naka-encrypt na payload, ang extension ay nagde-decrypt nito nang lokal. Mayamang media notification: ang server ay nagpapadala ng URL ng larawan, dina-download ng extension at ina-attach ito. Dynamic na lokalisasyon: pinapalitan ng extension ang text sa wika ng device.
| Senaryo | Walang extension | May extension |
|---|---|---|
| Larawan | Hindi suportado | Dina-download at ipinapakita |
| Encryption | Server ang nag-iingat ng susi | Pag-decrypt sa device |
| Text | Nakatakda sa server | Dynamic na pagpapalit |
| Validation | Hindi sinusuri | Pagkansela ng mapaminsalang notification |
Ang Notification Service Extension ay gumagana sa isang limitadong kapaligiran. Maximum na oras ng pagpapatupad — 30 segundo. Ang extension ay walang access sa pangunahing storage ng app (maliban sa App Group). Ang laki ng extension ay limitado sa 50 MB. Kapag lumampas sa oras, ang system ay tumatawag sa contentHandler na may orihinal na nilalaman at lahat ng pagbabago ay mawawala.
Sa Xcode, ang Notification Service Extension ay idinaragdag sa pamamagitan ng paggawa ng bagong target ng uri Notification Service Extension. Gumagawa ang Xcode ng template ng klase NotificationService na nagmamana mula sa UNNotificationServiceExtension, na may dalawang pamamaraan: didReceive at serviceExtensionTimeWillExpire.
Sa Xcode piliin ang File → New → Target → Notification Service Extension. Tukuyin ang pangalan (hal. PushNotificationService) at ang wikang Swift. Tiyakin na ang target ay naidagdag sa pangunahing app at may tamang lagda. Pagkatapos malikha, ang klase NotificationService.swift ay bubuo na may pangunahing implementasyon.
Ang Info.plist ng extension ay naglalaman ng key na NSExtension na may subkey na NSExtensionPointIdentifier (com.apple.usernotifications.service) at NSExtensionPrincipalClass (pangalan ng iyong controller). Opsyonal na maaaring tukuyin ang NSExtensionAttributes na may mga panuntunan sa pag-activate ng extension. Ang mga setting na ito ay awtomatikong nabubuo ng Xcode.
Ang pangunahing implementasyon ay nag-override sa didReceive, nagbabago ng nilalaman ng notification, at tumatawag sa contentHandler. Kung ang pagproseso ay masyadong matagal, ang serviceExtensionTimeWillExpire ay tinatawag, kung saan kailangan mong tapusin ang trabaho sa kasalukuyang estado.
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 = "[Naproseso] \(bestAttemptContent.title)"
contentHandler?(bestAttemptContent)
}
}
override func serviceExtensionTimeWillExpire() {
if let contentHandler = contentHandler,
let bestAttemptContent = bestAttemptContent {
contentHandler(bestAttemptContent)
}
}
}
Isa sa mga pangunahing gamit ng Service Extension ay ang pag-decrypt ng nilalaman ng notification sa device. Ang server ay nagpapadala ng naka-encrypt na payload, at ang extension ay nagde-decrypt nito gamit ang isang susi na nakaimbak sa Keychain o App Group. Tinitiyak nito na ang nilalaman ay hindi maaaring harangin habang nagpapadala.
Ini-encrypt ng server ang katawan ng notification gamit ang symmetrical key (AES-256). Ang encryption key ay napagkasunduan nang maaga sa pagitan ng client at server. Ang extension ay tumatanggap ng naka-encrypt na string sa data field ng payload, dina-decrypt ito, at inilalagay sa mga field ng notification. Susi ng user ay maaaring makuha mula sa Keychain pagkatapos ng authentication.
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)
}
Ang susi para sa pag-decrypt ay hindi dapat itago sa code ng extension o NSUserDefaults. Gamitin ang iOS Keychain na may access sa pamamagitan ng App Group, upang parehong mabasa ng app at extension ang susi. Para sa pagbuo ng susi sa client side, gamitin ang Security.framework na may AES-256-GCM algorithm.
Ang pinakakaraniwang gamit ng Notification Service Extension — pag-download ng mga larawan, GIF, at video para sa pagpapakita sa notification. Ang server ay nagpapadala ng URL ng media file, at dina-download ito ng extension, ini-save sa temporary directory, at gumagawa ng UNNotificationAttachment.
Ang extension ay tumatanggap ng URL ng larawan mula sa payload field ng notification. Gamit ang URLSession, dina-download ng extension ang file sa temporary directory. Pagkatapos ng download, ang UNNotificationAttachment ay ginagawa na may lokal na URL. Ang attachment ay ipinapasa sa binagong nilalaman. Awtomatikong ipinapakita ng iOS ang larawan sa standard interface o sa 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()
}
Sinusuportahan ng iOS ang mga sumusunod na format para sa pagpapakita sa mga notification: JPEG, PNG, GIF (static), MPEG-4 video hanggang 50 MB. Para sa audio files, suportado ang MP3, AAC, at ALAC. Mahalaga: lahat ng media file ay dapat i-download sa loob ng 30 segundong limitasyon. Para sa malalaking file, inirerekomenda ang server-side cropping o progressive download.
Pamamahala ng 30 segundong limitasyon — pangunahing gawain sa pag-develop ng Notification Service Extension. Kung hindi matapos ng extension ang pagproseso, ang system ay tumatawag sa serviceExtensionTimeWillExpire at nagpapakita ng orihinal na nilalaman. Dapat maglaan ng fallback scenario para sa bawat uri ng pagproseso.
Hatiin ang mga gawain ayon sa prayoridad. Ang mga kritikal na pagbabago (pag-decrypt, pangunahing lokalisasyon) ay gawin muna. Ang mga opsyonal na pagpapabuti (pag-download ng larawan, pagpapayaman ng text) — sa pangalawang pagkakataon. Gamitin ang URLSession na may timeout para sa mga network request upang hindi maubos ang buong limitasyon sa isang operasyon.
Kung nabigo ang pag-download ng larawan o ang pag-decrypt ng payload ay nagbalik ng error, ang extension ay dapat tumawag sa contentHandler na may orihinal na nilalaman. Huwag tapusin ang extension nang hindi tinatawagan ang contentHandler — ito ay magdudulot ng pagkawala ng notification. Ligtas na fallback ay dapat laging nakalaan sa code ng extension.
override func didReceive(
request: UNNotificationRequest,
withContentHandler handler: @escaping (UNNotificationContent) -> Void
) {
let content = (request.content.mutableCopy()
as? UNMutableNotificationContent) ?? request.content
// Kritikal na gawain: pag-decrypt
var decryptedContent = tryDecryptPayload(content)
// Opsyonal na gawain: media
guard let mediaUrl = decryptedContent.userInfo["media_url"]
as? String else {
handler(decryptedContent)
return
}
downloadAndAttachMedia(
content: decryptedContent,
mediaUrl: mediaUrl,
handler: handler
)
}
Para sa pag-test ng Notification Service Extension gamitin ang Xcode: piliin ang target ng extension, patakbuhin sa simulator, at magpadala ng push notification sa pamamagitan ng terminal o Firebase Console. I-log ang bawat yugto ng pagproseso sa pamamagitan ng os_log — ito ay tumutulong sa pag-diagnose ng mga problema sa oras at mga error sa pag-load.
Mga Madalas Itanong
Tatawagan ng system ang serviceExtensionTimeWillExpire, pagkatapos ay ipapakita ang orihinal na notification nang walang pagbabago. Lahat ng na-download na file at pagbabago ay itatapon.
Oo, kung tatawagan mo ang contentHandler na walang laman na nilalaman (UNNotificationContent na may walang laman na field), hindi ipapakita ang notification. Ito ay ginagamit para sa pag-filter ng spam notification o maling data.
Ang token ay maaaring ipasa sa userInfo ng payload ng notification o makuha mula sa Keychain sa pamamagitan ng App Group. Hindi inirerekomenda ang pag-iimbak ng token sa UserDefaults ng extension.
Ang extension ay dapat pirmahan ng parehong developer certificate gaya ng pangunahing app. Para sa produksyon, kinakailangan ang production certificate na may naka-enable na Push Notifications capability.
Ikonekta ang device sa Xcode, piliin ang target ng extension sa launch scheme, at magpadala ng push notification sa pamamagitan ng Firebase Console. Ang Breakpoints sa extension ay gumagana tulad ng sa pangunahing app.
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din