Give Mac Catalyst its own App Group prefix and sandbox entitlements
The App Group identifier registered in the portal does not change, but the string the runtime expects does: macOS and Mac Catalyst require the Team ID prefix, iOS forbids it. CalendarrAppGroup now resolves the right one per platform. Getting this wrong is the worst failure mode in the whole port — containerURL() returns nil, every snapshot read and write quietly no-ops, and the widgets show placeholder content forever with no error anywhere. A DEBUG assertion now makes that loud during development. Because the two platforms need different values, they need different entitlements files — listing both strings in one file breaks iOS provisioning on the unregistered prefixed value. Selected via CODE_SIGN_ENTITLEMENTS[sdk=macosx*], verified to resolve correctly for both destinations. The Catalyst entitlements are written App Store grade from the start, so one configuration serves both the Mac App Store and a notarized DMG: sandbox, network client, Contacts (birthday import), user-selected files (.ics import and export), the prefixed App Group, and keychain sharing. Deliberately absent: files.downloads, network.server, device.*, temporary-exception.* — nothing needs them and each is App Review friction. ENABLE_HARDENED_RUNTIME is required for notarization and ignored by the App Store, so it is safe to set unconditionally. Verified: builds for both Mac Catalyst and iOS Simulator. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
46
Calendarr iOS/Calendarr iOS-Catalyst.entitlements
Normal file
46
Calendarr iOS/Calendarr iOS-Catalyst.entitlements
Normal file
@@ -0,0 +1,46 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<!--
|
||||
Mac Catalyst entitlements. A separate file is required because the App
|
||||
Group value differs per platform: macOS demands the Team ID prefix, iOS
|
||||
forbids it, and listing both in one file breaks iOS provisioning.
|
||||
Selected via CODE_SIGN_ENTITLEMENTS[sdk=macosx*].
|
||||
|
||||
This one file serves both distribution paths. app-sandbox is required by
|
||||
the Mac App Store and desirable for Developer ID; ENABLE_HARDENED_RUNTIME
|
||||
is required for notarization and ignored by the App Store. Only the
|
||||
signing identity differs, and that is chosen at export time.
|
||||
-->
|
||||
<key>com.apple.security.app-sandbox</key>
|
||||
<true/>
|
||||
|
||||
<!-- Talks to the user's own Calendarr server. -->
|
||||
<key>com.apple.security.network.client</key>
|
||||
<true/>
|
||||
|
||||
<!-- BirthdaysImporter reads Contacts to sync birthdays. -->
|
||||
<key>com.apple.security.personal-information.addressbook</key>
|
||||
<true/>
|
||||
|
||||
<!-- .ics import (fileImporter) and calendar export (fileExporter). -->
|
||||
<key>com.apple.security.files.user-selected.read-write</key>
|
||||
<true/>
|
||||
|
||||
<!-- Must match CalendarrAppGroup.current on this platform, byte for byte. -->
|
||||
<key>com.apple.security.application-groups</key>
|
||||
<array>
|
||||
<string>PP34X97WS3.group.com.scarriffleservices.calendarr</string>
|
||||
</array>
|
||||
|
||||
<!-- Own group first: it stays the default access group, so tokens written
|
||||
before this entitlement existed keep resolving. The .shared group is
|
||||
what a second app from this team reads the auth token from. -->
|
||||
<key>keychain-access-groups</key>
|
||||
<array>
|
||||
<string>$(AppIdentifierPrefix)com.scarriffleservices.calendarr.ios</string>
|
||||
<string>$(AppIdentifierPrefix)com.scarriffleservices.calendarr.shared</string>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
||||
Reference in New Issue
Block a user