/permissionkit
Create child communication safety experiences using PermissionKit to request parental permission for children. Use when building apps that involve child-to-contact communication, need to check communication limits, request parent/guardian approval, or handle permission responses
$ npx -y skills add dpearson2699/swift-ios-skills --skill permissionkit --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/permissionkit
Context preview
The summary Claude sees to decide when to auto-load this skill.
Create child communication safety experiences using PermissionKit to request parental permission for children. Use when building apps that involve child-to-contact communication, need to check communication limits, request parent/guardian approval, or handle permission responses
SKILL.md
permissionkit.SKILL.mdname: permissionkit
description: "Create child communication safety experiences using PermissionKit to request parental permission for children. Use when building apps that involve child-to-contact communication, need to check communication limits, request parent/guardian approval, or handle permission responses for minors."
PermissionKit
Request permission from a parent or guardian to modify a child's communication rules. PermissionKit creates communication safety experiences that let children ask for exceptions to communication limits set by their parents.
PermissionKit communication experiences are available only through iMessage. Use it for parent/guardian approval flows, not as a general in-app contact permission, moderation, or chat-safety framework.
Contents
- [Availability and Setup](#availability-and-setup)
- [Core Concepts](#core-concepts)
- [Checking Communication Limits](#checking-communication-limits)
- [Creating Permission Questions](#creating-permission-questions)
- [Requesting Permission with AskCenter](#requesting-permission-with-askcenter)
- [SwiftUI Integration with PermissionButton](#swiftui-integration-with-permissionbutton)
- [Handling Responses](#handling-responses)
- [Significant App Update Topic](#significant-app-update-topic)
- [Common Mistakes](#common-mistakes)
- [Review Checklist](#review-checklist)
- [References](#references)
Availability and Setup
Import `PermissionKit`. Do not invent PermissionKit entitlement keys; verify current Apple documentation and Xcode capabilities before adding signing requirements.
import PermissionKit
Use this centralized version matrix and verify it against the current SDK:
| Tier | APIs | iOS/iPadOS/Mac Catalyst/macOS/visionOS | |---|---|---| | Core | Topics, handles, questions, responses, choices, `CommunicationLimits` | 26.0+ | | Errors | `AskError` | 26.1+ | | Presentation | `AskCenter`, ask/response sequences, `PermissionButton`, significant-update topics | 26.2+ |
Core Concepts
PermissionKit manages a flow where:
1. A child encounters a communication limit in your app 2. Your app creates a `PermissionQuestion` describing the request 3. The system presents the question to the child for them to send to their parent 4. The parent reviews and approves or denies the request 5. Your app receives a `PermissionResponse` with the parent's decision
Key Types
| Type | Role | |---|---| | `AskCenter` | Singleton that manages permission requests and responses | | `PermissionQuestion` | Describes the permission being requested | | `PermissionResponse` | The parent's decision (approval or denial) | | `PermissionChoice` | The specific answer (approve/decline) | | `PermissionButton` | SwiftUI button that triggers the permission flow | | `CommunicationTopic` | Topic for communication-related permission requests | | `CommunicationHandle` | A phone number, email, or custom identifier | | `CommunicationLimits` | Checks which communication handles are known to the system | | `SignificantAppUpdateTopic` | Topic for significant app update permission requests |
Checking Communication Limits
Use `CommunicationLimits.current` to check whether the system already knows a communication handle for your app. This is not an "are communication limits enabled?" probe. If limits are not enabled, `AskCenter.shared.ask(_:in:)` throws `AskError.communicationLimitsNotEnabled`; handle that path when asking.
`knownHandles(in:)` also requires the calling app to have a non-nil, nonempty bundle identifier. Corrected code should guard `Bundle.main.bundleIdentifier` before calling it.
import PermissionKit
func needsPermissionPrompt(for handle: CommunicationHandle) async -> Bool {
let limits = CommunicationLimits.current
let isKnown = await limits.isKnownHandle(handle)
return !isKnown
}
// Check multiple handles at once.
func filterKnownHandles(_ handles: Set<CommunicationHandle>) async -> Set<CommunicationHandle> {
guard Bundle.main.bundleIdentifier?.isEmpty == false else { return [] }
let limits = CommunicationLimits.current
return await limits.knownHandles(in: handles)
}Creating Communication Handles
let phoneHandle = CommunicationHandle(
value: "+1234567890",
kind: .phoneNumber
)
let emailHandle = CommunicationHandle(
value: "friend@example.com",
kind: .emailAddress
)
let customHandle = CommunicationHandle(
value: "user123",
kind: .custom
)Creating Permission Questions
Build a `PermissionQuestion` with the contact information and communication action type.
// Question for a single contact
let handle = CommunicationHandle(value: "+1234567890", kind: .phoneNumber)
let question = PermissionQuestion<CommunicationTopic>(handle: handle)
// Question for multiple contacts
let handles = [
CommunicationHandle(value: "+1234567890", kind: .phoneNumber),
CommunicationHandle(value: "friend@example.com", kind: .emailAddress)
]
let multiQuestion = PermissionQuestion<CommunicationTopic>(handles: handles)Using CommunicationTopic with Person Information
Provide display names and avatars for a richer permission prompt.
let personInfo = CommunicationTopic.PersonInformation(
handle: CommunicationHandle(value: "+1234567890", kind: .phoneNumber),
nameComponents: {
var name = PersonNameComponents()
name.givenName = "Alex"
name.familyName = "Smith"
return name
}(),
avatarImage: nil
)
let topic = CommunicationTopic(
personInformation: [personInfo],
actions: [.message, .audioCall]
)
let question = PermissionQuestion<CommunicationTopic>(communicationTopic: topic)Communication Actions
| Action | Description | |---|---| | `.message` | Text messaging | | `.audioCall` | Voice call | | `.videoCall` | Video call | | `.call` | Generic call | | `.chat` | Chat communication | | `.follow` | Follow a user | | `.beFollowed` | Allow being followed | | `.
Read more
name: permissionkit description: "Create child communication safety experiences using PermissionKit to request parental permission for children. Use when building apps that involve child-to-contact communication, need to check communication limits, request parent/guardian approval, or handle permission responses for minors."
PermissionKit
Request permission from a parent or guardian to modify a child's communication rules. PermissionKit creates communication safety experiences that let children ask for exceptions to communication limits set by their parents.
PermissionKit communication experiences are available only through iMessage. Use it for parent/guardian approval flows, not as a general in-app contact permission, moderation, or chat-safety framework.
Contents
- [Availability and Setup](#availability-and-setup)
- [Core Concepts](#core-concepts)
- [Checking Communication Limits](#checking-communication-limits)
- [Creating Permission Questions](#creating-permission-questions)
- [Requesting Permission with AskCenter](#requesting-permission-with-askcenter)
- [SwiftUI Integration with PermissionButton](#swiftui-integration-with-permissionbutton)
- [Handling Responses](#handling-responses)
- [Significant App Update Topic](#significant-app-update-topic)
- [Common Mistakes](#common-mistakes)
- [Review Checklist](#review-checklist)
- [References](#references)
Availability and Setup
Import `PermissionKit`. Do not invent PermissionKit entitlement keys; verify current Apple documentation and Xcode capabilities before adding signing requirements.
import PermissionKit
Use this centralized version matrix and verify it against the current SDK:
| Tier | APIs | iOS/iPadOS/Mac Catalyst/macOS/visionOS | |---|---|---| | Core | Topics, handles, questions, responses, choices, `CommunicationLimits` | 26.0+ | | Errors | `AskError` | 26.1+ | | Presentation | `AskCenter`, ask/response sequences, `PermissionButton`, significant-update topics | 26.2+ |
Core Concepts
PermissionKit manages a flow where:
1. A child encounters a communication limit in your app 2. Your app creates a `PermissionQuestion` describing the request 3. The system presents the question to the child for them to send to their parent 4. The parent reviews and approves or denies the request 5. Your app receives a `PermissionResponse` with the parent's decision
Key Types
| Type | Role | |---|---| | `AskCenter` | Singleton that manages permission requests and responses | | `PermissionQuestion` | Describes the permission being requested | | `PermissionResponse` | The parent's decision (approval or denial) | | `PermissionChoice` | The specific answer (approve/decline) | | `PermissionButton` | SwiftUI button that triggers the permission flow | | `CommunicationTopic` | Topic for communication-related permission requests | | `CommunicationHandle` | A phone number, email, or custom identifier | | `CommunicationLimits` | Checks which communication handles are known to the system | | `SignificantAppUpdateTopic` | Topic for significant app update permission requests |
Checking Communication Limits
Use `CommunicationLimits.current` to check whether the system already knows a communication handle for your app. This is not an "are communication limits enabled?" probe. If limits are not enabled, `AskCenter.shared.ask(_:in:)` throws `AskError.communicationLimitsNotEnabled`; handle that path when asking.
`knownHandles(in:)` also requires the calling app to have a non-nil, nonempty bundle identifier. Corrected code should guard `Bundle.main.bundleIdentifier` before calling it.
import PermissionKit
func needsPermissionPrompt(for handle: CommunicationHandle) async -> Bool {
let limits = CommunicationLimits.current
let isKnown = await limits.isKnownHandle(handle)
return !isKnown
}
// Check multiple handles at once.
func filterKnownHandles(_ handles: Set<CommunicationHandle>) async -> Set<CommunicationHandle> {
guard Bundle.main.bundleIdentifier?.isEmpty == false else { return [] }
let limits = CommunicationLimits.current
return await limits.knownHandles(in: handles)
}Creating Communication Handles
let phoneHandle = CommunicationHandle(
value: "+1234567890",
kind: .phoneNumber
)
let emailHandle = CommunicationHandle(
value: "friend@example.com",
kind: .emailAddress
)
let customHandle = CommunicationHandle(
value: "user123",
kind: .custom
)Creating Permission Questions
Build a `PermissionQuestion` with the contact information and communication action type.
// Question for a single contact
let handle = CommunicationHandle(value: "+1234567890", kind: .phoneNumber)
let question = PermissionQuestion<CommunicationTopic>(handle: handle)
// Question for multiple contacts
let handles = [
CommunicationHandle(value: "+1234567890", kind: .phoneNumber),
CommunicationHandle(value: "friend@example.com", kind: .emailAddress)
]
let multiQuestion = PermissionQuestion<CommunicationTopic>(handles: handles)Using CommunicationTopic with Person Information
Provide display names and avatars for a richer permission prompt.
let personInfo = CommunicationTopic.PersonInformation(
handle: CommunicationHandle(value: "+1234567890", kind: .phoneNumber),
nameComponents: {
var name = PersonNameComponents()
name.givenName = "Alex"
name.familyName = "Smith"
return name
}(),
avatarImage: nil
)
let topic = CommunicationTopic(
personInformation: [personInfo],
actions: [.message, .audioCall]
)
let question = PermissionQuestion<CommunicationTopic>(communicationTopic: topic)Communication Actions
| Action | Description | |---|---| | `.message` | Text messaging | | `.audioCall` | Voice call | | `.videoCall` | Video call | | `.call` | Generic call | | `.chat` | Chat communication | | `.follow` | Follow a user | | `.beFollowed` | Allow being followed | | `.
86 agent skills optimized for iOS 26+ development with Swift 6.3 and modern Apple frameworks.
Repo: dpearson2699/swift-ios-skills
Other skills on swift-ios-skills.
- /accessorysetupkit
Discover and configure Bluetooth and Wi-Fi accessories using AccessorySetupKit. Use when presenting a privacy-preserving accessory picker, defining discovery descriptors for BLE or Wi-Fi devices, handling accessory session events, migrating from CoreBluetooth permission-based
Open skill - /activitykit
Implement, review, or improve Live Activities and Dynamic Island experiences in iOS apps using ActivityKit. Use when building real-time updating widgets for the Lock Screen and Dynamic Island — delivery tracking, sports scores, ride-sharing status, workout timers, media
Open skill - /adattributionkit
Measure ad effectiveness with privacy-preserving attribution using AdAttributionKit. Use when registering ad impressions, handling attribution postbacks, updating conversion values, implementing re-engagement attribution, configuring publisher or advertiser apps, or replacing
Open skill - /alarmkit
Implement AlarmKit alarms and countdown timers for iOS and iPadOS with Lock Screen, Dynamic Island, StandBy, and paired Apple Watch system UI. Covers AlarmManager scheduling, AlarmAttributes and AlarmPresentation, system Stop and AlarmButton secondary actions, authorization,
Open skill - /app-clips
Build iOS App Clips with invocation URLs, App Clip Codes, NFC, QR codes, Safari banners, Maps, Messages, target setup, App Store Connect experiences, size/capability constraints, NSUserActivity routing, SKOverlay promotion, App Group/keychain handoff, ephemeral notifications,
Open skill - /app-intents
Implement App Intents for Siri, Shortcuts, Spotlight, widgets, Control Center, and Apple Intelligence on iOS. Covers AppIntent actions, AppEntity and EntityQuery models, AppShortcutsProvider phrases, IndexedEntity Spotlight indexing, WidgetConfigurationIntent, SnippetIntent, and
Open skill

