| 1 | <?xml version="1.0" encoding="UTF-8"?> |
| 2 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> |
| 3 | <plist version="1.0"> |
| 4 | <dict> |
| 5 | <!-- The ship entitlements the scaffold build deferred: sandbox on, real |
| 6 | keychain group, communication notifications. The restricted ones |
| 7 | (keychain group, communication) ride the provisioning profile that |
| 8 | automatic signing embeds at archive time. Existing installs keep their |
| 9 | identity across this change: Keychain.swift always used the |
| 10 | data-protection keychain and reads group-first-then-ungrouped, and |
| 11 | everything the app keeps on disk is a rebuildable cache. --> |
| 12 | <key>com.apple.security.app-sandbox</key> |
| 13 | <true/> |
| 14 | <key>com.apple.security.network.client</key> |
| 15 | <true/> |
| 16 | <!-- read-write: attachment uploads read picked files; "Save" panels write |
| 17 | downloads — both user-initiated through the powerbox. --> |
| 18 | <key>com.apple.security.files.user-selected.read-write</key> |
| 19 | <true/> |
| 20 | <!-- Same app-family group as iOS: the saved-instances store |
| 21 | (LChatCore/Keychain.swift) writes here once the entitlement exists. --> |
| 22 | <key>keychain-access-groups</key> |
| 23 | <array> |
| 24 | <string>$(AppIdentifierPrefix)com.elevenmessenger.messenger.shared</string> |
| 25 | </array> |
| 26 | <!-- Same app group as iOS. Two on-device caches resolve into this container |
| 27 | (containerURL returns the path on macOS whether or not the entitlement |
| 28 | exists, so a sandboxed build WITHOUT it has all access silently denied): |
| 29 | SharedAvatarCache — every avatar read/write is denied, banners fall back |
| 30 | to the monogram forever (#474); and MessageStore's local SQLite/FTS index |
| 31 | (LChatCore/MessageStore.swift, storeDir) — the store can't open, so |
| 32 | message search returns nothing while the feed still renders (#1121). The |
| 33 | Mac App ID needs the App Groups capability so the embedded profile |
| 34 | authorizes the group (unprovisioned group access prompts on macOS 15+). --> |
| 35 | <key>com.apple.security.application-groups</key> |
| 36 | <array> |
| 37 | <string>group.com.elevenmessenger.messenger</string> |
| 38 | </array> |
| 39 | <!-- Communication notifications: banner restyle via INSendMessageIntent — |
| 40 | sender's photo/monogram as the icon (CommunicationNotification.swift). --> |
| 41 | <key>com.apple.developer.usernotifications.communication</key> |
| 42 | <true/> |
| 43 | <!-- Universal links (docs/native-onboarding.md E.2, #1376): clicking an |
| 44 | https /join link on a covered domain opens the Mac app directly |
| 45 | instead of riding the elevenmessenger:// custom-scheme handoff. Same |
| 46 | domain set as iOS (LChat.entitlements — Apple's rule: every domain |
| 47 | named in the shipped binary, so custom domains keep the web join page |
| 48 | + its "Open in the app" button). Inert until the server half deploys: |
| 49 | the AASA names the Mac app id since PR #1383 (main.go serveAASA). --> |
| 50 | <key>com.apple.developer.associated-domains</key> |
| 51 | <array> |
| 52 | <string>applinks:*.elevenmessenger.com</string> |
| 53 | <string>applinks:11ch.at</string> |
| 54 | <string>applinks:*.11ch.at</string> |
| 55 | </array> |
| 56 | <!-- Sparkle under the sandbox: the running app must connect to the |
| 57 | installer's status (-spks) and installer (-spki) mach services, or |
| 58 | every update dies at "An error occurred while running the updater" — |
| 59 | SUEnableInstallerLauncherService alone only launches Installer.xpc; |
| 60 | these exceptions let the app talk to it (Sparkle's sandboxing docs). |
| 61 | Missing since sandboxing landed (#474), so no 0.5.0+ build could |
| 62 | self-update; the fix only arms builds that CONTAIN it, hence the |
| 63 | one-time manual install to 0.7.3. --> |
| 64 | <key>com.apple.security.temporary-exception.mach-lookup.global-name</key> |
| 65 | <array> |
| 66 | <string>$(PRODUCT_BUNDLE_IDENTIFIER)-spks</string> |
| 67 | <string>$(PRODUCT_BUNDLE_IDENTIFIER)-spki</string> |
| 68 | </array> |
| 69 | </dict> |
| 70 | </plist> |
| 71 | |