Skip to content
Development
Skill

/push-notifications

Generate push notification infrastructure with APNs registration, handling, and rich notifications. Use when adding push notifications, configuring APNs, notification categories/actions, or rich notifications with images and custom UI.

From plugin
rshankras-apple-skills
848181 skills

Claude Code

$ npx -y skills add rshankras/claude-code-apple-skills --skill push-notifications --agent claude-code

SKILL.md

push-notifications.SKILL.md
name: push-notifications
description: Generate push notification infrastructure with APNs registration, handling, and rich notifications. Use when adding push notifications, configuring APNs, notification categories/actions, or rich notifications with images and custom UI.
allowed-tools: [Read, Write, Edit, Glob, Grep, Bash, AskUserQuestion]
last_verified: 2026-07-16
review_by: 2027-06-22
os_version: iOS 27 / macOS 27

Push Notifications Generator

Generate push notification infrastructure with APNs registration, handling, and rich notifications.

When This Skill Activates

  • User wants to add push notifications to their app
  • User mentions APNs (Apple Push Notification service)
  • User asks about notification categories or actions
  • User wants rich notifications with images or custom UI

Pre-Generation Checks

Before generating, verify:

1. **Existing Notification Code**

   # Check for existing notification handling
   grep -r "UNUserNotificationCenter\|registerForRemoteNotifications" --include="*.swift" | head -5

2. **Entitlements**

   # Check for push notification entitlement
   find . -name "*.entitlements" -exec grep -l "aps-environment" {} \;

3. **App Delegate or SwiftUI App**

   # Determine app structure
   grep -r "@main\|UIApplicationDelegate" --include="*.swift" | head -5

Configuration Questions

1. Notification Types

  • **Basic** - Simple alerts with title/body
  • **Rich** - Include images, custom UI (requires Notification Service Extension)
  • **Both** - Full notification support

2. Notification Actions

  • **None** - Just display notifications
  • **Simple Actions** - Quick action buttons
  • **Custom Categories** - Multiple action categories

3. Silent Notifications

  • **Yes** - Background data updates
  • **No** - User-visible only

Generated Files

Core Infrastructure

Sources/Notifications/
├── NotificationManager.swift      # Central notification management
├── NotificationDelegate.swift     # UNUserNotificationCenterDelegate
├── NotificationCategories.swift   # Action categories definition
└── NotificationPayload.swift      # Type-safe payload parsing

Rich Notifications (Optional)

NotificationServiceExtension/
├── NotificationService.swift      # Modify notifications before display
└── Info.plist                     # Extension configuration

Content Extension (Optional)

NotificationContentExtension/
├── NotificationViewController.swift  # Custom notification UI
├── MainInterface.storyboard
└── Info.plist

Key Features

Registration Flow

@MainActor
final class NotificationManager {
    static let shared = NotificationManager()

    func requestAuthorization() async throws -> Bool {
        let center = UNUserNotificationCenter.current()
        let options: UNAuthorizationOptions = [.alert, .badge, .sound]
        return try await center.requestAuthorization(options: options)
    }

    func registerForRemoteNotifications() {
        UIApplication.shared.registerForRemoteNotifications()
    }
}

Handling Notifications

// Foreground notification
func userNotificationCenter(
    _ center: UNUserNotificationCenter,
    willPresent notification: UNNotification
) async -> UNNotificationPresentationOptions {
    return [.banner, .sound, .badge]
}

// Notification tap/action
func userNotificationCenter(
    _ center: UNUserNotificationCenter,
    didReceive response: UNNotificationResponse
) async {
    let userInfo = response.notification.request.content.userInfo
    await handleNotificationAction(response.actionIdentifier, userInfo: userInfo)
}

Action Categories

enum NotificationCategory: String {
    case message = "MESSAGE_CATEGORY"
    case reminder = "REMINDER_CATEGORY"

    var actions: [UNNotificationAction] {
        switch self {
        case .message:
            return [
                UNNotificationAction(identifier: "REPLY", title: "Reply", options: []),
                UNNotificationAction(identifier: "MARK_READ", title: "Mark as Read", options: [])
            ]
        case .reminder:
            return [
                UNNotificationAction(identifier: "COMPLETE", title: "Complete", options: []),
                UNNotificationAction(identifier: "SNOOZE", title: "Snooze", options: [])
            ]
        }
    }
}

Notification Design (WWDC18)

"Interrupting people is a real privilege… a trust relationship." Design the strategy before the infrastructure:

| Decision | Rule | |----------|------| | Authorization | Use **provisional authorization** (add `.provisional` to the options — delivered quietly to Notification Center, no prompt) for passive content like likes and comments; reserve the explicit prompt for **time-critical** content | | When to prompt | **Never at first launch.** Explain the value first, then ask at a contextually meaningful moment — right after the order is placed, not before the user has ordered | | Content bar | Every notification carries a **specific message or a completable task** — never an empty "open the app" nudge | | Timing | Deliver at relevant times; use time- and location-based delivery where it fits | | Settings | Offer **granular per-topic toggles in-app**, and add `.providesAppNotificationSettings` so "Manage" in system settings deep-links to your page | | Grouping | App-level grouping is the default; set `threadIdentifier` **only for meaningfully different streams** (conversations, distinct sources) — over-threading recreates the clutter grouping was meant to fix | | Rich content | A rich notification is a **self-contained package**: image/video plus actions that complete the task without launching the app | | Fatigue | **Pause notification types a user repeatedly ignores** (the Duolingo pattern) — silence beats an uninstall |

Required Capabilities

In Xcode

1. Select project target 2. Signing & Capabilities tab 3. Add "Push Notifications"

Read more
@rshankras
Ships withrshankras-apple-skills

A collection of Claude Code skills for iOS, macOS, watchOS, visionOS, and Apple platform development. These skills help you plan and build apps, maintain code quality, ensure HIG compliance, and guide you from idea to App Store.

Stars on GitHub

Momentum

stars in total
848
Star history of rshankras/claude-code-apple-skills on GitHub, a chart by star-history.com

Other skills on rshankras-apple-skills.

More skills from other plugins.

brainstorming
Auto-invoked

brainstorming

You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…

@obra@obraInstall Skill
ask-matt

ask-matt

Ask which skill or flow fits your situation. A router over the skills in this repo.

skills10d309k
@mattpocock@mattpocockInstall Skill
accessibility
Auto-invoked

accessibility

Design, implement, and audit accessible UI to WCAG 2.2 Level AA across Web, iOS, and Android — semantic ARIA roles and labels,…

ecc12d293k
@affaan-m@affaan-mInstall Skill
compiler-commit

compiler-commit

Use when you want to verify compiler changes and commit with the correct convention. Runs tests, lint, and format, then commits…

react1d252k
@facebook@facebookInstall Skill

Questions about push-notifications.

Which coding agents can use push-notifications?
push-notifications installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.