Skip to content
Client v5: BLE, BLE Hosting, HTTP, Jobs - Linux, MacOS, & Blazor Support! Full AOT, RX on BLE only & MANY other features! Power up!

Permissions

Shiny.Calendar uses Shiny.Core’s AccessState permission model — the same model used across every Shiny module. ICalendarStore exposes two members for working with calendar access:

// Request access (triggers the OS prompt if needed). Pass the level you need.
var access = await calendarStore.RequestAccess(CalendarAccessType.ReadWrite);
// Check the current state without prompting
var current = calendarStore.GetCurrentAccess();
ValueMeaning
ReadOnlyRead calendars and events.
WriteOnlyiOS 17+ add-only access — create events without seeing existing ones. Other platforms treat this as read/write.
ReadWriteFull access (default).
StateMeaning
AccessState.AvailableAccess granted.
AccessState.RestrictedPartial — iOS write-only, or Android read-only / write-only.
AccessState.DeniedDenied.
AccessState.UnknownNot yet determined. Also the Windows GetCurrentAccess() result — call RequestAccess.
<uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission android:name="android.permission.WRITE_CALENDAR" />

iOS 17+ / Mac Catalyst / macOS — Info.plist

Section titled “iOS 17+ / Mac Catalyst / macOS — Info.plist”
<key>NSCalendarsFullAccessUsageDescription</key>
<string>This app needs access to your calendar.</string>
<!-- Only if you request write-only (add-only) access: -->
<key>NSCalendarsWriteOnlyAccessUsageDescription</key>
<string>This app needs to add events to your calendar.</string>

On iOS < 17 use the legacy NSCalendarsUsageDescription key.

Mac Catalyst / sandboxed macOS — entitlement

Section titled “Mac Catalyst / sandboxed macOS — entitlement”

The Info.plist keys alone are not enough under the App Sandbox — and Mac Catalyst turns the sandbox on by default. Without the calendar entitlement, RequestAccess returns Denied and the system prompt never appears, which looks exactly like a missing platform implementation:

<ItemGroup Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'maccatalyst'">
<CustomEntitlements Include="com.apple.security.personal-information.calendars"
Type="Boolean"
Value="true" />
</ItemGroup>
<uap:Capability Name="appointments" />
var access = await calendarStore.RequestAccess(CalendarAccessType.ReadWrite);
if (access != AccessState.Available)
{
// handle denied / restricted before any CRUD
return;
}