accessorysetupkit
Discover and configure Bluetooth and Wi-Fi accessories using AccessorySetupKit. Use when presenting a privacy-preserving accessory picker, defining discovery…
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.
/permissionkitContext 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
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."
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.
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+ |
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
| 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 |
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)
}let phoneHandle = CommunicationHandle(
value: "+1234567890",
kind: .phoneNumber
)
let emailHandle = CommunicationHandle(
value: "friend@example.com",
kind: .emailAddress
)
let customHandle = CommunicationHandle(
value: "user123",
kind: .custom
)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)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)| 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
Discover and configure Bluetooth and Wi-Fi accessories using AccessorySetupKit. Use when presenting a privacy-preserving accessory picker, defining discovery…
Implement, review, or improve Live Activities and Dynamic Island experiences in iOS apps using ActivityKit. Use when building real-time updating widgets for…
Measure ad effectiveness with privacy-preserving attribution using AdAttributionKit. Use when registering ad impressions, handling attribution postbacks,…
Implement AlarmKit alarms and countdown timers for iOS and iPadOS with Lock Screen, Dynamic Island, StandBy, and paired Apple Watch system UI. Covers…
Build iOS App Clips with invocation URLs, App Clip Codes, NFC, QR codes, Safari banners, Maps, Messages, target setup, App Store Connect experiences,…
Implement App Intents for Siri, Shortcuts, Spotlight, widgets, Control Center, and Apple Intelligence on iOS. Covers AppIntent actions, AppEntity and…