Everything in this project is self-contained — there are no Swift packages to install, no CocoaPods, no Homebrew dependencies. The only things that require manual action in Xcode are listed below.
The project is configured for automatic code signing but no team is pre-selected.
To run on a real iPhone or iPad:
- Open
iOSIntegrationsWorkshop.xcodeprojin Xcode. - Select the project in the Navigator (the blue icon at the top).
- Select the iOSIntegrationsWorkshop target.
- Open the Signing & Capabilities tab.
- Under Signing, choose your Apple ID team from the Team dropdown.
- If your Apple ID isn't listed: Xcode → Settings → Accounts → + → Apple ID.
- A free Apple Developer account is sufficient for running on your own device.
Simulator only? Skip this step — the simulator does not require code signing.
This project targets iOS 26.2 and uses APIs introduced in iOS 17:
| API | Introduced |
|---|---|
requestFullAccessToEvents() |
iOS 17 |
requestFullAccessToReminders() |
iOS 17 |
@Observable macro |
iOS 17 |
ContentUnavailableView |
iOS 17 |
Any device or simulator running iOS 17 or later will work. The Xcode deployment target in project.pbxproj is set to 26.2, so Xcode will enforce this automatically.
EventKit works fully in the iOS Simulator. A few things to know:
- The simulator has its own isolated Calendar and Reminders databases. Your Mac's events and reminders are not visible — the lists start empty.
- To have sample data to browse, open the Calendar or Reminders app inside the simulator and create a few entries before launching the workshop app.
- Permission dialogs appear and work normally.
Running on a real device gives you access to your actual Calendar and Reminders data. Events and reminders you create will appear in Apple's apps immediately (and sync via iCloud if enabled).
The permission dialogs appear automatically the first time you tap "Grant Access" in the app. iOS shows each dialog only once.
If you tapped "Don't Allow" and want to re-test the permission flow:
Option A — Reset the entire simulator:
Device menu → Erase All Content and Settings… This resets all permissions, apps, and data on that simulator.
Option B — Reset only this app's permissions:
Open Settings in the simulator → Privacy & Security → Calendars or Reminders → toggle the app off, then on.
Option C — Delete and reinstall the app:
Long-press the app icon → Remove App. Reinstalling resets its permissions.
Settings → Privacy & Security → Calendars (or Reminders) → toggle the app off.
To re-trigger the dialog (iOS doesn't show it a second time after a denial), you must delete and reinstall the app, or toggle the permission off then back on in Settings.
The human-readable strings shown in the system permission dialogs are already configured in the project's build settings — no manual Info.plist editing is needed.
To view or change them:
- In Xcode, select the project → iOSIntegrationsWorkshop target → Build Settings.
- Search for
INFOPLIST_KEY_NS. - You'll see:
NSCalendarsFullAccessUsageDescription— shown in the Calendar permission dialog.NSRemindersFullAccessUsageDescription— shown in the Reminders permission dialog.
To edit: double-click the value and type a new string. Changes take effect on the next build.
Why build settings instead of Info.plist? The project uses
GENERATE_INFOPLIST_FILE = YES, which auto-generatesInfo.plistat build time fromINFOPLIST_KEY_*build settings. This avoids maintaining a separate XML file and keeps all configuration in one place.
EventKit (Calendar and Reminders) does not require adding a Capability in Xcode. Unlike frameworks such as HealthKit, CloudKit, or Push Notifications, EventKit only needs Info.plist entries — which are already in place.
You do not need to visit Signing & Capabilities to enable anything for this workshop.
| Task | |
|---|---|
| ☐ | Open iOSIntegrationsWorkshop.xcodeproj in Xcode |
| ☐ | Set Development Team if running on a physical device (skip for simulator) |
| ☐ | Select a simulator or connected device in the toolbar |
| ☐ | Press ⌘R to build and run |
| ☐ | Tap a module card on the home screen |
| ☐ | Tap "Grant Access" when prompted |