Thanks for the detailed response.
To clarify and add some details about my testing setup and observations:
Verification that the extension isn’t being triggered:
I’ve confirmed that the Notification Service Extension (NSE) is not being invoked at all and not just failing to modify the content with the following pointers:
The didReceive(_:withContentHandler:) and serviceExtensionTimeWillExpire() methods never log or execute (I’ve added multiple test print/log statements and file-based logs for confirmation).
The extension process itself does not appear in Console.app or in the process list.
On iOS, using the exact same payload and code, I can see clear logs from the extension when it runs — so the extension logic and payload are validated there.
Console logs checked:
I’ve filtered the macOS Console for both the main app bundle ID and the extension’s bundle ID. There are no messages indicating the NSE being launched, terminated, or crashing.
The system only logs the standard “Received remote notification” message for the main app’s bundle ID.
Extension setup:
The NSE target is correctly added to the same macOS app project. It uses the standard UNNotificationServiceExtension class.
The extension has a valid Info.plist with the correct NSExtension dictionary (NSExtensionPointIdentifier = com.apple.usernotifications.service).
Code signing and entitlements match across the app and extension.
The app requests and receives remote notification permissions normally.
Payload details:
The remote notification payload contains "mutable-content": 1 inside the aps dictionary:
{
"aps": {
"alert": {
"title": "Meeting Reminder",
"body": "Join the weekly sync call"
},
"mutable-content": 1
},
"MEETING_ORGANIZER": "Alex Johnson"
}
Behavior summary:
On iOS → NSE launches and modifies the notification title (confirmed via logs and on-device display).
On macOS → Notification displays as sent, but no logs, no extension process, and no indication that the NSE was invoked, while remote notifications behavior is working as expected.
If there is any supported way to intercept or modify remote notification content before display on macOS (e.g., using a different extension type, entitlement, or API path), that would also be very helpful to know? Or any other way to check if the NSE/NCE is getting invoked.
Do tell me if you need any details or the full project.