Independent OpenClaw reporting, releases, guides, and community coverage
OpenClaw News

OpenClaw Stops iOS Node Permission Prompts

OpenClaw now returns permission-required errors for iOS node calls instead of blocking gateway invokes with native prompts.

Filed under Posts 3 min read Updated Jul 4, 2026
OpenClaw Stops iOS Node Permission Prompts

OpenClaw's iOS node gained an important execution-boundary fix today in PR #99477. The change stops Calendar, Reminders, and Contacts node commands from opening native iOS permission prompts inside node.invoke.

That sounds small, but it closes a real agent-runtime trap. A gateway call is waiting for a node response. A native iOS permission sheet is waiting for foreground user interaction. If those two waits meet in the wrong place, the agent turn can hang until a timeout instead of getting a clear answer.

What Changed

Before this PR, iOS node commands could request permissions directly from service methods:

  • calendar.events and calendar.add could call EventKit request APIs.
  • reminders.list and reminders.add could call EventKit request APIs.
  • contacts.search and contacts.add could call Contacts access request APIs.

The PR applies the same contract that Photos already used: node services should not prompt during node.invoke. Instead, they should inspect current authorization state and return the existing service-specific permission error when access has not been granted.

Calendar and Reminders now read EventKit authorization status through the existing read/write helpers. Contacts reads current Contacts authorization state and treats .notDetermined as unavailable. The actual permission prompts remain owned by the app's foreground Settings privacy surface, where a human is intentionally managing access.

Why It Matters

Mobile node calls are transport work. The Gateway sends a request, the node executes it, and the agent expects a structured response. Permission prompts are UI work. They need a person, a foreground app, and clear context about what is being allowed.

Mixing those two responsibilities makes failure confusing. An agent asking for contacts should be able to say "permission required" immediately. It should not stall because iOS is displaying a sheet the user may not see.

This fix is especially useful for OpenClaw setups where mobile nodes run as part of longer automations. If a calendar, reminder, or contact action lacks permission, the agent can now explain the missing permission path instead of burning the turn on a timeout.

Evidence From the PR

The PR added NodeServicePermissionTests for .notDetermined permission states across Calendar, Reminders, and Contacts. It also reports simulator testing on iOS 26.5 and two real setup-code pairings against an isolated local Gateway.

The before-and-after proof is direct. Before the fix, a real paired-gateway contacts.search invocation opened the native Contacts prompt from the node call, and leaving it unanswered caused gateway timeout behavior. After the fix, contacts.search, calendar.events, and reminders.list immediately returned their permission-required errors with no native alert.

The granted-permission path was also checked: once permissions were granted from the appropriate UI surface, those same node calls succeeded.

Bottom Line

This is a clean boundary fix. OpenClaw's iOS node services now keep node.invoke prompt-free for Calendar, Reminders, and Contacts. Permission requests stay in the app's settings UI, while agent calls get fast, structured permission errors when access is missing.

For anyone using iOS as an OpenClaw node, PR #99477 should make permission failures much easier to understand and recover from.

Daily Briefing

Get the Open-Source Briefing

The stories that matter, delivered to your inbox every morning. Free, no spam, unsubscribe anytime.

Join 45,000+ developers. No spam. Unsubscribe anytime.