eleven / messenger Public

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>
Paul Campbell 2aee22783b2b88173459ebf797d68c54030761ff parent 1f19276
5 files changed, +33 −0
  • ios/LChatMac/LChatMac-Dev.entitlements +6 −0
  • ios/LChatMac/LChatMac.entitlements +11 −0
  • ios/LChatNSE/Info.plist +4 −0
  • ios/LChatNSE/LChatNSE.entitlements +7 −0
  • ios/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