native: the two missing notification-avatar entitlements (#1108)
iOS: the communication entitlement was on the app only, but the banner restyle (updating(from: INSendMessageIntent)) runs in the NSE process — without it there, every live push shipped the plain banner (bare app icon, no face, no monogram). Add it to LChatNSE.entitlements + declare INSendMessageIntent in the NSE Info.plist alongside, matching the app. Mac: sandboxing (#474) landed without the app-group entitlement, and SharedAvatarCache resolves to the group container regardless — so every avatar read/write has been silently sandbox-denied since 2026-07-09 and banners always fell back to the monogram. Add the group to the ship and dev entitlements.
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
5 files changed,
+33
−0
ios/LChatMac/LChatMac-Dev.entitlements+6 −0ios/LChatMac/LChatMac.entitlements+11 −0ios/LChatNSE/Info.plist+4 −0ios/LChatNSE/LChatNSE.entitlements+7 −0ios/project.yml+5 −0
diff --git a/ios/LChatMac/LChatMac-Dev.entitlements b/ios/LChatMac/LChatMac-Dev.entitlements| index d6bda9f..025e83c 100644 |
| --- a/ios/LChatMac/LChatMac-Dev.entitlements |
| +++ b/ios/LChatMac/LChatMac-Dev.entitlements |
| @@ -25,6 +25,12 @@ |
| <array> |
| <string>$(AppIdentifierPrefix)com.elevenmessenger.messenger.shared</string> |
| </array> |
| + <!-- App group — see LChatMac.entitlements: without it the sandbox denies |
| + the avatar cache's group container and banners monogram forever. --> |
| + <key>com.apple.security.application-groups</key> |
| + <array> |
| + <string>group.com.elevenmessenger.messenger</string> |
| + </array> |
| <key>com.apple.developer.usernotifications.communication</key> |
| <true/> |
| <!-- Sparkle installer mach services — see LChatMac.entitlements. --> |
diff --git a/ios/LChatMac/LChatMac.entitlements b/ios/LChatMac/LChatMac.entitlements| index 4b0652c..8a1311d 100644 |
| --- a/ios/LChatMac/LChatMac.entitlements |
| +++ b/ios/LChatMac/LChatMac.entitlements |
| @@ -23,6 +23,17 @@ |
| <array> |
| <string>$(AppIdentifierPrefix)com.elevenmessenger.messenger.shared</string> |
| </array> |
| + <!-- Same app group as iOS: SharedAvatarCache resolves its directory to the |
| + group container (containerURL returns the path on macOS whether or not |
| + the entitlement exists), so a sandboxed build WITHOUT this entitlement |
| + has every avatar read/write silently denied — banners fall back to the |
| + monogram forever. Missing since sandboxing landed (#474). The Mac App |
| + ID needs the App Groups capability so the embedded profile authorizes |
| + the group (unprovisioned group access prompts on macOS 15+). --> |
| + <key>com.apple.security.application-groups</key> |
| + <array> |
| + <string>group.com.elevenmessenger.messenger</string> |
| + </array> |
| <!-- Communication notifications: banner restyle via INSendMessageIntent — |
| sender's photo/monogram as the icon (CommunicationNotification.swift). --> |
| <key>com.apple.developer.usernotifications.communication</key> |
diff --git a/ios/LChatNSE/Info.plist b/ios/LChatNSE/Info.plist| index 751bf7b..c32fc36 100644 |
| --- a/ios/LChatNSE/Info.plist |
| +++ b/ios/LChatNSE/Info.plist |
| @@ -27,5 +27,9 @@ |
| <key>NSExtensionPrincipalClass</key> |
| <string>$(PRODUCT_MODULE_NAME).NotificationService</string> |
| </dict> |
| + <key>NSUserActivityTypes</key> |
| + <array> |
| + <string>INSendMessageIntent</string> |
| + </array> |
| </dict> |
| </plist> |
diff --git a/ios/LChatNSE/LChatNSE.entitlements b/ios/LChatNSE/LChatNSE.entitlements| index 5820db5..3e17587 100644 |
| --- a/ios/LChatNSE/LChatNSE.entitlements |
| +++ b/ios/LChatNSE/LChatNSE.entitlements |
| @@ -15,5 +15,12 @@ |
| <array> |
| <string>group.com.elevenmessenger.messenger</string> |
| </array> |
| + <!-- Communication notifications: the banner restyle |
| + (UNNotificationContent.updating(from: INSendMessageIntent)) runs in |
| + THIS process, so the extension needs the entitlement itself — with only |
| + the app holding it, updating(from:) throws here and every live push |
| + ships the plain banner (bare app icon, no sender face/monogram). --> |
| + <key>com.apple.developer.usernotifications.communication</key> |
| + <true/> |
| </dict> |
| </plist> |
diff --git a/ios/project.yml b/ios/project.yml| index c040983..e0b787b 100644 |
| --- a/ios/project.yml |
| +++ b/ios/project.yml |
| @@ -243,6 +243,11 @@ targets: |
| CFBundleVersion: "$(CURRENT_PROJECT_VERSION)" |
| CFBundleShortVersionString: "$(MARKETING_VERSION)" |
| CFBundleDisplayName: Eleven Notifications |
| + # Communication notifications: declared alongside the entitlement in |
| + # LChatNSE.entitlements (the restyle runs in this process), matching |
| + # the app target's declaration. |
| + NSUserActivityTypes: |
| + - INSendMessageIntent |
| NSExtension: |
| NSExtensionPointIdentifier: com.apple.usernotifications.service |
| NSExtensionPrincipalClass: $(PRODUCT_MODULE_NAME).NotificationService |