{"id":"8d271182-3701-4c52-85c8-8fa2813d757a","shortId":"EU98Kj","kind":"skill","title":"App Clips","tagline":"Swift Ios Skills skill by Dpearson2699","description":"# App Clips\n\nLightweight, instantly-available versions of your iOS app for in-the-moment experiences or demos. Targets iOS 26+ / Swift 6.3 unless noted.\n\n## Contents\n\n- [App Clip Target Setup](#app-clip-target-setup)\n- [Invocation URL Handling](#invocation-url-handling)\n- [App Clip Experience Configuration](#app-clip-experience-configuration)\n- [Size Limits](#size-limits)\n- [Invocation Methods](#invocation-methods)\n- [Data Migration to Full App](#data-migration-to-full-app)\n- [SKOverlay for Full App Promotion](#skoverlay-for-full-app-promotion)\n- [Location Confirmation](#location-confirmation)\n- [Lifecycle and Ephemeral Nature](#lifecycle-and-ephemeral-nature)\n- [Capabilities and Limitations](#capabilities-and-limitations)\n- [Common Mistakes](#common-mistakes)\n- [Review Checklist](#review-checklist)\n- [References](#references)\n\n## App Clip Target Setup\n\nAn App Clip is a **separate target** in the same Xcode project as your full app:\n\n1. **File → New → Target → App Clip** — Xcode creates the target with the `com.apple.developer.on-demand-install-capable` entitlement and a `Parent Application Identifiers` entitlement linking back to the full app.\n2. The App Clip bundle ID **must** be a suffix of the full app's: `com.example.MyApp.Clip`.\n3. Xcode adds an **Embed App Clip** build phase to the full app target automatically.\n\n### Share code between targets\n\nUse Swift packages or shared source files. Add files to **both** targets, or use the `APPCLIP` active compilation condition:\n\n```swift\n// In App Clip target Build Settings → Active Compilation Conditions: APPCLIP\n\n#if !APPCLIP\n// Full-app-only code (e.g., background tasks, App Intents)\n#else\n// App Clip specific code\n#endif\n```\n\nPrefer local Swift packages for shared modules — add the package as a dependency of both targets.\n\n### Shared asset catalogs\n\nCreate a shared asset catalog included in both targets to avoid duplicating images and colors.\n\n## Invocation URL Handling\n\nApp Clips receive an `NSUserActivity` of type `NSUserActivityTypeBrowsingWeb` on launch. Handle it with `onContinueUserActivity`:\n\n```swift\n@main\nstruct DonutShopClip: App {\n    var body: some Scene {\n        WindowGroup {\n            ContentView()\n                .onContinueUserActivity(\n                    NSUserActivityTypeBrowsingWeb\n                ) { activity in\n                    handleInvocation(activity)\n                }\n        }\n    }\n\n    private func handleInvocation(_ activity: NSUserActivity) {\n        guard let url = activity.webpageURL,\n              let components = URLComponents(url: url, resolvingAgainstBaseURL: true)\n        else { return }\n\n        // Extract path/query to determine context\n        let locationID = components.queryItems?\n            .first(where: { $0.name == \"location\" })?.value\n\n        // Update UI for this location\n    }\n}\n```\n\nFor UIKit scene-based apps, implement `scene(_:willConnectTo:options:)` for cold launch and `scene(_:continue:)` for warm launch.\n\n**Key rule:** The full app **must** handle all invocation URLs identically — when a user installs the full app, it replaces the App Clip and receives all future invocations.\n\n## App Clip Experience Configuration\n\nConfigure experiences in **App Store Connect** after uploading a build containing the App Clip.\n\n### Default App Clip experience (required)\n\n- Provide: header image, subtitle (≤56 chars), call-to-action verb\n- App Store Connect generates a **default App Clip link**: `https://appclip.apple.com/id?=<bundle_id>&key=value`\n- Supports: QR codes, NFC tags, Messages, Spotlight, other apps\n\n### Demo App Clip link\n\n- Auto-generated by App Store Connect for demo versions of your app\n- Supports **all invocations** including physical (App Clip Codes, NFC, QR)\n- Allows larger binary size (up to 100 MB uncompressed)\n- Cannot contain URL parameters\n\n### Advanced App Clip experiences (optional)\n\n- Required for: Maps integration, location association, App Clip Codes, per-location card imagery\n- Each experience has its own invocation URL, header image, and metadata\n- URL **prefix matching** lets one registered URL cover many sub-paths\n- Use the App Store Connect API to manage large numbers of experiences programmatically\n\n### Associated domains\n\nFor custom URLs (not the default Apple-generated link), add entries to the Associated Domains entitlement and host an AASA file:\n\n```text\nappclips:example.com\n```\n\n## Size Limits\n\nApp Clip binaries must stay within strict uncompressed size limits (measured via App Thinning Size Report):\n\n| iOS Version | Maximum Uncompressed Size |\n|---|---|\n| iOS 15 and earlier | 10 MB |\n| iOS 16 | 15 MB |\n| iOS 17+ (digital invocations only) | 100 MB |\n| iOS 17+ (via demo link, all invocations) | 100 MB |\n\nThe 100 MB limit on iOS 17+ for non-demo links requires: digital-only invocations, no physical invocation support (no App Clip Codes / NFC / QR), and the App Clip must not support iOS 16 or earlier.\n\n**Measure size:** Archive the app → Distribute → Export as Ad Hoc/Development with App Thinning → check `App Thinning Size Report.txt`.\n\nUse Background Assets to download additional content post-launch (e.g., game levels) if needed. App Clip downloads cannot use `isEssential`.\n\n## Invocation Methods\n\n| Method | Requirements |\n|---|---|\n| **App Clip Codes** | Advanced experience or demo link; NFC-integrated or scan-only |\n| **NFC tags** | Encode invocation URL in NDEF payload |\n| **QR codes** | Encode invocation URL; works with default or advanced experience |\n| **Safari Smart Banners** | Associate App Clip with website; add `<meta>` tag |\n| **Maps** | Advanced experience with place association |\n| **Messages** | Share invocation URL as text; limited preview with demo links |\n| **Siri Suggestions** | Location-based; requires advanced experience for location suggestions |\n| **Other apps** | iOS 17+; use Link Presentation or `UIApplication.open(_:)` |\n\n### Safari Smart App Banner\n\nAdd this meta tag to your website to show the App Clip banner:\n\n```html\n<meta name=\"apple-itunes-app\"\n      content=\"app-id=YOUR_APP_ID, app-clip-bundle-id=com.example.MyApp.Clip,\n               app-clip-display=card\">\n```\n\n## Data Migration to Full App\n\nWhen a user installs the full app, it replaces the App Clip. Use a **shared App Group container** to migrate data:\n\n```swift\n// In both targets: add App Groups capability with the same group ID\n\n// App Clip — write data\nfunc saveOrderHistory(_ orders: [Order]) throws {\n    guard let containerURL = FileManager.default.containerURL(\n        forSecurityApplicationGroupIdentifier: \"group.com.example.myapp.shared\"\n    ) else { return }\n\n    let data = try JSONEncoder().encode(orders)\n    let fileURL = containerURL.appendingPathComponent(\"orders.json\")\n    try data.write(to: fileURL)\n}\n\n// Full app — read migrated data\nfunc loadMigratedOrders() throws -> [Order] {\n    guard let containerURL = FileManager.default.containerURL(\n        forSecurityApplicationGroupIdentifier: \"group.com.example.myapp.shared\"\n    ) else { return [] }\n\n    let fileURL = containerURL.appendingPathComponent(\"orders.json\")\n    guard FileManager.default.fileExists(atPath: fileURL.path) else { return [] }\n    let data = try Data(contentsOf: fileURL)\n    return try JSONDecoder().decode([Order].self, from: data)\n}\n```\n\n### Shared UserDefaults\n\n```swift\n// Write (App Clip)\nlet shared = UserDefaults(suiteName: \"group.com.example.myapp.shared\")\nshared?.set(userToken, forKey: \"authToken\")\n\n// Read (Full app)\nlet shared = UserDefaults(suiteName: \"group.com.example.myapp.shared\")\nlet token = shared?.string(forKey: \"authToken\")\n```\n\n### Keychain sharing\n\nStarting iOS 15.4, App Clip keychain items are accessible to the corresponding full app via the `parent-application-identifiers` and `associated-appclip-app-identifiers` entitlements. Use distinct `kSecAttrLabel` values to distinguish App Clip vs. full app entries.\n\n### Sign in with Apple\n\nStore the `ASAuthorizationAppleIDCredential.user` in the shared container so the full app can silently verify without re-prompting login.\n\n## SKOverlay for Full App Promotion\n\nDisplay an overlay recommending the full app from within the App Clip:\n\n### SwiftUI\n\n```swift\nstruct OrderCompleteView: View {\n    @State private var showOverlay = false\n\n    var body: some View {\n        VStack {\n            Text(\"Order placed!\")\n            Button(\"Get the full app\") { showOverlay = true }\n        }\n        .appStoreOverlay(isPresented: $showOverlay) {\n            SKOverlay.AppClipConfiguration(position: .bottom)\n        }\n    }\n}\n```\n\n### UIKit\n\n```swift\nfunc displayOverlay() {\n    guard let scene = view.window?.windowScene else { return }\n\n    let config = SKOverlay.AppClipConfiguration(position: .bottom)\n    let overlay = SKOverlay(configuration: config)\n    overlay.delegate = self\n    overlay.present(in: scene)\n}\n```\n\n`SKOverlay.AppClipConfiguration` automatically resolves to the parent app. Available iOS 14.0+.\n\n**Never** block the user's task to force installation — show the overlay after task completion.\n\n## Location Confirmation\n\nUse `APActivationPayload` to verify a user's physical location without requesting full location access:\n\n```swift\nimport AppClip\nimport CoreLocation\n\nfunc verifyLocation(from activity: NSUserActivity) {\n    guard let payload = activity.appClipActivationPayload,\n          let url = activity.webpageURL\n    else { return }\n\n    // Build the expected region (up to 500m radius)\n    let center = CLLocationCoordinate2D(latitude: 37.334722, longitude: -122.008889)\n    let region = CLCircularRegion(center: center, radius: 100, identifier: \"store-42\")\n\n    payload.confirmAcquired(in: region) { inRegion, error in\n        if let error = error as? APActivationPayloadError {\n            switch error.code {\n            case .doesNotMatch:\n                // URL doesn't match registered App Clip URL\n                break\n            case .disallowed:\n                // User denied location, or invocation wasn't NFC/visual code\n                break\n            @unknown default:\n                break\n            }\n            return\n        }\n\n        if inRegion {\n            // Confirmed — user is at the expected location\n        } else {\n            // User is not at expected location (e.g., NFC tag was moved)\n        }\n    }\n}\n```\n\nEnable location confirmation in `Info.plist`:\n\n```xml\n<key>NSAppClip</key>\n<dict>\n    <key>NSAppClipRequestLocationConfirmation</key>\n    <true/>\n</dict>\n```\n\nThis is **lightweight** — the system verifies location without granting your App Clip continuous access. The App Clip card shows a note that the clip can verify location. Available iOS 14.0+.\n\n## Lifecycle and Ephemeral Nature\n\n- **No Home Screen icon** — App Clips appear in the App Library and recent apps\n- **Automatic removal** — the system deletes the App Clip and its data after a period of inactivity (typically ~30 days, system-determined)\n- **No persistent state guarantee** — treat App Clip storage as ephemeral; migrate important data to the shared container or a server\n- **Relaunching** — returning to a previously launched App Clip from the App Library uses the last invocation URL; returning from the App Switcher launches without an invocation URL (restore saved state)\n- **Notifications** — App Clips can request ephemeral notification permission (up to 8 hours) via `Info.plist`; set `NSAppClipRequestEphemeralUserNotification` to `true`\n- **Location access** — `requestWhenInUseAuthorization()` only; resets daily at 4:00 AM\n\n## Capabilities and Limitations\n\n### Available to App Clips\n\nSwiftUI, UIKit, Core Location (when-in-use), Sign in with Apple, Apple Pay, CloudKit (public database read-only, iOS 16+), Background Assets, StoreKit (`SKOverlay`), Keychain, App Groups, Push Notifications (ephemeral), Live Activities (iOS 16.1+)\n\n### Not available / no-op at runtime\n\nApp Intents, Background Tasks, CallKit, Contacts, CoreMotion, EventKit, HealthKit, HomeKit, MediaPlayer, Messages, NearbyInteraction, PhotoKit, SensorKit, Speech, SKAdNetwork, App Tracking Transparency\n\n### Additional restrictions\n\n- No background URL sessions\n- No background Bluetooth\n- No multiple scenes on iPad\n- No on-demand resources\n- No custom URL schemes\n- No in-app purchases (reserve for full app)\n- `UIDevice.name` and `identifierForVendor` return empty strings\n\n## Common Mistakes\n\n### Exceeding App Clip size limit\n\n```swift\n// ❌ DON'T: Include large frameworks or bundled assets\n// Importing heavyweight frameworks like RealityKit or large ML models\n// pushes the App Clip well over 10–15 MB.\n\n// ✅ DO: Use Asset Catalog thinning, exclude unused architectures,\n// strip debug symbols, and split shared code into lean Swift packages.\n// Measure with App Thinning Size Report after every change.\n```\n\n### Not testing invocation URLs locally\n\n```swift\n// ❌ DON'T: Only test App Clip with a direct Xcode launch\n// This skips invocation URL handling and misses bugs.\n\n// ✅ DO: Use the _XCAppClipURL environment variable in the scheme,\n// or register a Local Experience in Settings → Developer → Local Experiences\n// to test with realistic invocation URLs and App Clip cards.\n```\n\n### Not handling the full app replacing the App Clip\n\n```swift\n// ❌ DON'T: Assume only the App Clip receives invocations\n// When the user installs the full app, ALL invocations go to it.\n\n// ✅ DO: Share invocation-handling code between both targets.\n// The full app must handle every invocation URL the App Clip supports.\n#if !APPCLIP\n// Full app can additionally show richer features for the same URL\n#endif\n```\n\n### Storing critical data only in App Clip storage\n\n```swift\n// ❌ DON'T: Store important data in the App Clip's sandboxed container\nlet fileURL = documentsDirectory.appendingPathComponent(\"userData.json\")\n// This data is DELETED when the system removes the App Clip.\n\n// ✅ DO: Write to the shared App Group container or sync to a server\nguard let shared = FileManager.default.containerURL(\n    forSecurityApplicationGroupIdentifier: \"group.com.example.shared\"\n) else { return }\nlet fileURL = shared.appendingPathComponent(\"userData.json\")\n```\n\n### Missing associated domains configuration\n\n```swift\n// ❌ DON'T: Configure App Clip experiences in App Store Connect\n// without setting up associated domains and the AASA file.\n// Invocations from your website and advanced experiences will fail.\n\n// ✅ DO: Add the Associated Domains entitlement with:\n//   appclips:example.com\n// AND host /.well-known/apple-app-site-association on your server:\n// {\n//   \"appclips\": {\n//     \"apps\": [\"TEAMID.com.example.MyApp.Clip\"]\n//   }\n// }\n```\n\n## Review Checklist\n\n- [ ] App Clip target bundle ID is a suffix of the full app's bundle ID\n- [ ] `Parent Application Identifiers` entitlement is set correctly\n- [ ] Shared code uses Swift packages or compilation conditions (`APPCLIP`)\n- [ ] `onContinueUserActivity(NSUserActivityTypeBrowsingWeb)` handles invocation URLs\n- [ ] Full app handles all invocation URLs the App Clip supports\n- [ ] App Thinning Size Report confirms binary is within size limits for target iOS\n- [ ] Associated Domains entitlement includes `appclips:yourdomain.com` (if using custom URLs)\n- [ ] AASA file hosted at `/.well-known/apple-app-site-association` (if using custom URLs)\n- [ ] Default App Clip experience configured in App Store Connect\n- [ ] Shared App Group container used for data the full app needs\n- [ ] `SKOverlay` / `appStoreOverlay` shown **after** task completion, never blocking\n- [ ] `NSAppClipRequestLocationConfirmation` set in Info.plist if using location verification\n- [ ] No reliance on background processing, restricted frameworks, or persistent local storage\n- [ ] Tested with Local Experiences (Settings → Developer) and `_XCAppClipURL` env var\n- [ ] Handles launch without invocation URL (App Switcher / notification re-entry)\n\n## References\n\n- [App Clips framework](https://sosumi.ai/documentation/appclip/)\n- [Creating an App Clip with Xcode](https://sosumi.ai/documentation/appclip/creating-an-app-clip-with-xcode/)\n- [Configuring App Clip experiences](https://sosumi.ai/documentation/appclip/configuring-the-launch-experience-of-your-app-clip/)\n- [Responding to invocations](https://sosumi.ai/documentation/appclip/responding-to-invocations/)\n- [Choosing the right functionality](https://sosumi.ai/documentation/appclip/choosing-the-right-functionality-for-your-app-clip/)\n- [Confirming a person's physical location](https://sosumi.ai/documentation/appclip/confirming-a-person-s-physical-location/)\n- [Sharing data between App Clip and full app](https://sosumi.ai/documentation/appclip/sharing-data-between-your-app-clip-and-your-full-app/)\n- [Recommending your app to App Clip users](https://sosumi.ai/documentation/appclip/recommending-your-app-to-app-clip-users/)\n- [APActivationPayload](https://sosumi.ai/documentation/appclip/apactivationpayload/)\n- [SKOverlay.AppClipConfiguration](https://sosumi.ai/documentation/storekit/skoverlay/appclipconfiguration/)\n- [NSUserActivityTypeBrowsingWeb](https://sosumi.ai/documentation/foundation/nsuseractivitytypebrowsingweb/)\n- [Creating App Clip Codes](https://sosumi.ai/documentation/appclip/creating-app-clip-codes/)\n- [Distributing your App Clip](https://sosumi.ai/documentation/appclip/distributing-your-app-clip/)\n- [App Clips HIG](https://sosumi.ai/design/human-interface-guidelines/app-clips/)","tags":["app","clips","swift","ios","skills","dpearson2699"],"capabilities":["skill","source-dpearson2699","category-swift-ios-skills"],"categories":["swift-ios-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/dpearson2699/swift-ios-skills/app-clips","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"install_from":"skills.sh"}},"qualityScore":"0.300","qualityRationale":"deterministic score 0.30 from registry signals: · indexed on skills.sh · published under dpearson2699/swift-ios-skills","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill:v1","enrichmentVersion":1,"enrichedAt":"2026-04-22T03:40:33.904Z","embedding":null,"createdAt":"2026-04-18T20:34:43.081Z","updatedAt":"2026-04-22T03:40:33.904Z","lastSeenAt":"2026-04-22T03:40:33.904Z","tsv":"'-122.008889':1171 '-42':1181 '/.well-known/apple-app-site-association':1795,1877 '/design/human-interface-guidelines/app-clips/)':2047 '/documentation/appclip/)':1956 '/documentation/appclip/apactivationpayload/)':2019 '/documentation/appclip/choosing-the-right-functionality-for-your-app-clip/)':1985 '/documentation/appclip/configuring-the-launch-experience-of-your-app-clip/)':1972 '/documentation/appclip/confirming-a-person-s-physical-location/)':1994 '/documentation/appclip/creating-an-app-clip-with-xcode/)':1965 '/documentation/appclip/creating-app-clip-codes/)':2034 '/documentation/appclip/distributing-your-app-clip/)':2041 '/documentation/appclip/recommending-your-app-to-app-clip-users/)':2015 '/documentation/appclip/responding-to-invocations/)':1978 '/documentation/appclip/sharing-data-between-your-app-clip-and-your-full-app/)':2005 '/documentation/foundation/nsuseractivitytypebrowsingweb/)':2027 '/documentation/storekit/skoverlay/appclipconfiguration/)':2023 '/id?=':455 '0.name':355 '00':1398 '1':146 '10':616,1539 '100':500,627,636,639,1178 '14.0':1106,1281 '15':613,620,1540 '15.4':963 '16':619,673,1428 '16.1':1442 '17':623,630,644,794 '2':176 '26':30 '3':192 '30':1317 '37.334722':1169 '4':1397 '500m':1163 '56':437 '6.3':32 '8':1382 'aasa':584,1773,1873 'access':969,1137,1265,1391 'action':442 'activ':227,237,323,326,330,1146,1440 'activity.appclipactivationpayload':1151 'activity.webpageurl':335,1154 'ad':684 'add':194,218,266,574,761,804,848,1785 'addit':699,1470,1681 'advanc':507,722,751,764,786,1780 'allow':494 'apactivationpayload':1125,2016 'apactivationpayloaderror':1193 'api':554 'app':1,9,19,36,41,52,57,75,81,85,91,126,131,145,150,175,178,189,197,204,232,245,251,254,296,314,368,386,399,403,410,417,426,429,444,450,466,468,475,483,489,508,518,551,591,603,660,667,680,687,690,709,719,757,792,802,814,822,829,833,838,849,857,889,933,947,964,974,985,994,998,1014,1026,1034,1038,1062,1103,1203,1262,1267,1290,1295,1299,1306,1327,1348,1352,1362,1373,1405,1434,1450,1467,1496,1501,1511,1535,1563,1580,1621,1628,1631,1639,1649,1666,1673,1679,1695,1706,1724,1731,1759,1763,1800,1804,1815,1841,1847,1850,1883,1888,1892,1900,1944,1951,1959,1967,1998,2002,2008,2010,2029,2037,2042 'app-clip-experience-configur':56 'app-clip-target-setup':40 'appclip':226,240,242,587,984,1140,1677,1791,1799,1834,1867 'appclip.apple.com':454 'appclip.apple.com/id?=':453 'appear':1292 'appl':571,1003,1418,1419 'apple-gener':570 'applic':167,979,1820 'appstoreoverlay':1065,1903 'architectur':1549 'archiv':678 'asauthorizationappleidcredential.user':1006 'asset':276,281,696,1430,1523,1544 'associ':517,562,578,756,768,983,1752,1769,1787,1863 'associated-appclip-app-identifi':982 'assum':1636 'atpath':911 'authtoken':944,958 'auto':472 'auto-gener':471 'automat':206,1098,1300 'avail':14,1104,1279,1403,1444 'avoid':288 'back':171 'background':249,695,1429,1452,1473,1477,1921 'banner':755,803,816 'base':367,784 'binari':496,593,1855 'block':1108,1909 'bluetooth':1478 'bodi':316,1051 'bottom':1070,1086 'break':1206,1218,1221 'bug':1594 'build':199,235,423,1157 'bundl':180,1522,1807,1817 'button':1058 'call':440 'call-to-act':439 'callkit':1454 'cannot':503,712 'capabilities-and-limit':110 'capabl':107,111,162,851,1400 'card':524,1269,1623 'case':1196,1207 'catalog':277,282,1545 'category-swift-ios-skills' 'center':1166,1175,1176 'chang':1569 'char':438 'check':689 'checklist':120,123,1803 'choos':1979 'clcircularregion':1174 'clip':2,10,37,42,53,58,127,132,151,179,198,233,255,297,404,411,427,430,451,469,490,509,519,592,661,668,710,720,758,815,834,858,934,965,995,1039,1204,1263,1268,1275,1291,1307,1328,1349,1374,1406,1512,1536,1581,1622,1632,1640,1674,1696,1707,1725,1760,1805,1848,1884,1952,1960,1968,1999,2011,2030,2038,2043 'cllocationcoordinate2d':1167 'cloudkit':1421 'code':208,247,257,460,491,520,662,721,743,1217,1556,1660,1827,2031 'cold':374 'color':292 'com.apple.developer.on':158 'com.example.myapp.clip':191 'common':114,117,1508 'common-mistak':116 'compil':228,238,1832 'complet':1121,1907 'compon':337 'components.queryitems':352 'condit':229,239,1833 'config':1083,1091 'configur':55,60,413,414,1090,1754,1758,1886,1966 'confirm':94,97,1123,1225,1246,1854,1986 'connect':419,446,477,553,1765,1890 'contact':1455 'contain':424,504,840,1010,1338,1710,1733,1894 'containerurl':868,899 'containerurl.appendingpathcomponent':882,907 'content':35,700 'contentsof':919 'contentview':320 'context':349 'continu':378,1264 'core':1409 'coreloc':1142 'coremot':1456 'correct':1825 'correspond':972 'cover':544 'creat':153,278,1957,2028 'critic':1691 'custom':565,1490,1871,1880 'daili':1395 'data':71,77,818,843,860,875,892,916,918,928,1310,1334,1692,1703,1716,1897,1996 'data-migration-to-full-app':76 'data.write':885 'databas':1423 'day':1318 'debug':1551 'decod':924 'default':428,449,569,749,1220,1882 'delet':1304,1718 'demand':160,1487 'demand-install-cap':159 'demo':27,467,479,632,648,725,778 'deni':1210 'depend':271 'determin':348,1321 'develop':1611,1934 'digit':624,652 'digital-on':651 'direct':1584 'disallow':1208 'display':1028 'displayoverlay':1074 'distinct':989 'distinguish':993 'distribut':681,2035 'documentsdirectory.appendingpathcomponent':1713 'doesn':1199 'doesnotmatch':1197 'domain':563,579,1753,1770,1788,1864 'donutshopclip':313 'download':698,711 'dpearson2699':8 'duplic':289 'e.g':248,704,1239 'earlier':615,675 'els':253,343,872,903,913,1080,1155,1232,1745 'emb':196 'empti':1506 'enabl':1244 'encod':736,744,878 'endif':258,1689 'entitl':163,169,580,987,1789,1822,1865 'entri':575,999,1949 'env':1937 'environ':1599 'ephemer':100,105,1284,1331,1377,1438 'error':1186,1190,1191 'error.code':1195 'eventkit':1457 'everi':1568,1669 'example.com':588,1792 'exceed':1510 'exclud':1547 'expect':1159,1230,1237 'experi':25,54,59,412,415,431,510,527,560,723,752,765,787,1608,1613,1761,1781,1885,1932,1969 'export':682 'extract':345 'fail':1783 'fals':1049 'featur':1684 'file':147,217,219,585,1774,1874 'filemanager.default.containerurl':869,900,1742 'filemanager.default.fileexists':910 'fileurl':881,887,906,920,1712,1748 'fileurl.path':912 'first':353 'forc':1114 'forkey':943,957 'forsecurityapplicationgroupidentifi':870,901,1743 'framework':1520,1526,1924,1953 'full':74,80,84,90,144,174,188,203,244,385,398,821,828,888,946,973,997,1013,1025,1033,1061,1135,1500,1627,1648,1665,1678,1814,1840,1899,2001 'full-app-on':243 'func':328,861,893,1073,1143 'function':1982 'futur':408 'game':705 'generat':447,473,572 'get':1059 'go':1652 'grant':1260 'group':839,850,855,1435,1732,1893 'group.com.example.myapp.shared':871,902,939,952 'group.com.example.shared':1744 'guarante':1325 'guard':332,866,897,909,1075,1148,1739 'handl':47,51,295,306,388,1591,1625,1659,1668,1837,1842,1939 'handleinvoc':325,329 'header':434,533 'healthkit':1458 'heavyweight':1525 'hig':2044 'hoc/development':685 'home':1287 'homekit':1459 'host':582,1794,1875 'hour':1383 'html':817 'icon':1289 'id':181,856,1808,1818 'ident':392 'identifi':168,980,986,1179,1821 'identifierforvendor':1504 'imag':290,435,534 'imageri':525 'implement':369 'import':1139,1141,1333,1524,1702 'in-app':1494 'in-the-mo':21 'inact':1315 'includ':283,487,1518,1866 'info.plist':1248,1385,1913 'inregion':1185,1224 'instal':161,396,826,1115,1646 'instant':13 'instantly-avail':12 'integr':515,729 'intent':252,1451 'invoc':45,49,66,69,293,390,409,486,531,625,635,654,657,715,737,745,771,1213,1357,1367,1572,1589,1618,1642,1651,1658,1670,1775,1838,1844,1942,1975 'invocation-handl':1657 'invocation-method':68 'invocation-url-handl':48 'io':4,18,29,607,612,618,622,629,643,672,793,962,1105,1280,1427,1441,1862 'ipad':1483 'isessenti':714 'ispres':1066 'item':967 'jsondecod':923 'jsonencod':877 'key':382,456 'keychain':959,966,1433 'ksecattrlabel':990 'larg':557,1519,1530 'larger':495 'last':1356 'latitud':1168 'launch':305,375,381,703,1347,1364,1586,1940 'lean':1558 'let':333,336,350,540,867,874,880,898,905,915,935,948,953,1076,1082,1087,1149,1152,1165,1172,1189,1711,1740,1747 'level':706 'librari':1296,1353 'lifecycl':98,103,1282 'lifecycle-and-ephemeral-natur':102 'lightweight':11,1254 'like':1527 'limit':62,65,109,113,590,600,641,775,1402,1514,1859 'link':170,452,470,573,633,649,726,779,796 'live':1439 'loadmigratedord':894 'local':260,1574,1607,1612,1927,1931 'locat':93,96,356,362,516,523,783,789,1122,1132,1136,1211,1231,1238,1245,1258,1278,1390,1410,1916,1991 'location-bas':782 'location-confirm':95 'locationid':351 'login':1022 'longitud':1170 'main':311 'manag':556 'mani':545 'map':514,763 'match':539,1201 'maximum':609 'mb':501,617,621,628,637,640,1541 'measur':601,676,1561 'mediaplay':1460 'messag':463,769,1461 'meta':806 'metadata':536 'method':67,70,716,717 'migrat':72,78,819,842,891,1332 'miss':1593,1751 'mistak':115,118,1509 'ml':1531 'model':1532 'modul':265 'moment':24 'move':1243 'multipl':1480 'must':182,387,594,669,1667 'natur':101,106,1285 'ndef':740 'nearbyinteract':1462 'need':708,1901 'never':1107,1908 'new':148 'nfc':461,492,663,728,734,1240 'nfc-integr':727 'nfc/visual':1216 'no-op':1445 'non':647 'non-demo':646 'note':34,1272 'notif':1372,1378,1437,1946 'nsappclip':1250 'nsappcliprequestephemeralusernotif':1387 'nsappcliprequestlocationconfirm':1251,1910 'nsuseract':300,331,1147 'nsuseractivitytypebrowsingweb':303,322,1836,2024 'number':558 'on-demand':1485 'oncontinueuseract':309,321,1835 'one':541 'op':1447 'option':372,511 'order':863,864,879,896,925,1056 'ordercompleteview':1043 'orders.json':883,908 'overlay':1030,1088,1118 'overlay.delegate':1092 'overlay.present':1094 'packag':213,262,268,1560,1830 'paramet':506 'parent':166,978,1102,1819 'parent-application-identifi':977 'path':548 'path/query':346 'pay':1420 'payload':741,1150 'payload.confirmacquired':1182 'per':522 'per-loc':521 'period':1313 'permiss':1379 'persist':1323,1926 'person':1988 'phase':200 'photokit':1463 'physic':488,656,1131,1990 'place':767,1057 'posit':1069,1085 'post':702 'post-launch':701 'prefer':259 'prefix':538 'present':797 'preview':776 'previous':1346 'privat':327,1046 'process':1922 'programmat':561 'project':141 'promot':86,92,1027 'prompt':1021 'provid':433 'public':1422 'purchas':1497 'push':1436,1533 'qr':459,493,664,742 'radius':1164,1177 're':1020,1948 're-entri':1947 're-prompt':1019 'read':890,945,1425 'read-on':1424 'realist':1617 'realitykit':1528 'receiv':298,406,1641 'recent':1298 'recommend':1031,2006 'refer':124,125,1950 'region':1160,1173,1184 'regist':542,1202,1605 'relaunch':1342 'relianc':1919 'remov':1301,1722 'replac':401,831,1629 'report':606,1566,1853 'report.txt':693 'request':1134,1376 'requestwheninuseauthor':1392 'requir':432,512,650,718,785 'reserv':1498 'reset':1394 'resolv':1099 'resolvingagainstbaseurl':341 'resourc':1488 'respond':1973 'restor':1369 'restrict':1471,1923 'return':344,873,904,914,921,1081,1156,1222,1343,1359,1505,1746 'review':119,122,1802 'review-checklist':121 'richer':1683 'right':1981 'rule':383 'runtim':1449 'safari':753,800 'sandbox':1709 'save':1370 'saveorderhistori':862 'scan':732 'scan-on':731 'scene':318,366,370,377,1077,1096,1481 'scene-bas':365 'scheme':1492,1603 'screen':1288 'self':926,1093 'sensorkit':1464 'separ':135 'server':1341,1738,1798 'session':1475 'set':236,941,1386,1610,1767,1824,1911,1933 'setup':39,44,129 'share':207,215,264,275,280,770,837,929,936,940,949,955,960,1009,1337,1555,1656,1730,1741,1826,1891,1995 'shared.appendingpathcomponent':1749 'show':812,1116,1270,1682 'shown':1904 'showoverlay':1048,1063,1067 'sign':1000,1415 'silent':1016 'siri':780 'size':61,64,497,589,599,605,611,677,692,1513,1565,1852,1858 'size-limit':63 'skadnetwork':1466 'skill':5,6 'skip':1588 'skoverlay':82,88,1023,1089,1432,1902 'skoverlay-for-full-app-promot':87 'skoverlay.appclipconfiguration':1068,1084,1097,2020 'smart':754,801 'sosumi.ai':1955,1964,1971,1977,1984,1993,2004,2014,2018,2022,2026,2033,2040,2046 'sosumi.ai/design/human-interface-guidelines/app-clips/)':2045 'sosumi.ai/documentation/appclip/)':1954 'sosumi.ai/documentation/appclip/apactivationpayload/)':2017 'sosumi.ai/documentation/appclip/choosing-the-right-functionality-for-your-app-clip/)':1983 'sosumi.ai/documentation/appclip/configuring-the-launch-experience-of-your-app-clip/)':1970 'sosumi.ai/documentation/appclip/confirming-a-person-s-physical-location/)':1992 'sosumi.ai/documentation/appclip/creating-an-app-clip-with-xcode/)':1963 'sosumi.ai/documentation/appclip/creating-app-clip-codes/)':2032 'sosumi.ai/documentation/appclip/distributing-your-app-clip/)':2039 'sosumi.ai/documentation/appclip/recommending-your-app-to-app-clip-users/)':2013 'sosumi.ai/documentation/appclip/responding-to-invocations/)':1976 'sosumi.ai/documentation/appclip/sharing-data-between-your-app-clip-and-your-full-app/)':2003 'sosumi.ai/documentation/foundation/nsuseractivitytypebrowsingweb/)':2025 'sosumi.ai/documentation/storekit/skoverlay/appclipconfiguration/)':2021 'sourc':216 'source-dpearson2699' 'specif':256 'speech':1465 'split':1554 'spotlight':464 'start':961 'state':1045,1324,1371 'stay':595 'storag':1329,1697,1928 'store':418,445,476,552,1004,1180,1690,1701,1764,1889 'storekit':1431 'strict':597 'string':956,1507 'strip':1550 'struct':312,1042 'sub':547 'sub-path':546 'subtitl':436 'suffix':185,1811 'suggest':781,790 'suitenam':938,951 'support':458,484,658,671,1675,1849 'swift':3,31,212,230,261,310,844,931,1041,1072,1138,1515,1559,1575,1633,1698,1755,1829 'swiftui':1040,1407 'switch':1194 'switcher':1363,1945 'symbol':1552 'sync':1735 'system':1256,1303,1320,1721 'system-determin':1319 'tag':462,735,762,807,1241 'target':28,38,43,128,136,149,155,205,210,222,234,274,286,847,1663,1806,1861 'task':250,1112,1120,1453,1906 'teamid.com.example.myapp.clip':1801 'test':1571,1579,1615,1929 'text':586,774,1055 'thin':604,688,691,1546,1564,1851 'throw':865,895 'token':954 'track':1468 'transpar':1469 'treat':1326 'tri':876,884,917,922 'true':342,1064,1389 'type':302 'typic':1316 'ui':359 'uiapplication.open':799 'uidevice.name':1502 'uikit':364,1071,1408 'uncompress':502,598,610 'unknown':1219 'unless':33 'unus':1548 'updat':358 'upload':421 'url':46,50,294,334,339,340,391,505,532,537,543,566,738,746,772,1153,1198,1205,1358,1368,1474,1491,1573,1590,1619,1671,1688,1839,1845,1872,1881,1943 'urlcompon':338 'use':211,224,549,694,713,795,835,988,1124,1354,1414,1543,1596,1828,1870,1879,1895,1915 'user':395,825,1110,1129,1209,1226,1233,1645,2012 'userdata.json':1714,1750 'userdefault':930,937,950 'usertoken':942 'valu':357,457,991 'var':315,1047,1050,1938 'variabl':1600 'verb':443 'verif':1917 'verifi':1017,1127,1257,1277 'verifyloc':1144 'version':15,480,608 'via':602,631,975,1384 'view':1044,1053 'view.window':1078 'vs':996 'vstack':1054 'warm':380 'wasn':1214 'websit':760,810,1778 'well':1537 'when-in-us':1411 'willconnectto':371 'windowgroup':319 'windowscen':1079 'within':596,1036,1857 'without':1018,1133,1259,1365,1766,1941 'work':747 'write':859,932,1727 'xcappclipurl':1598,1936 'xcode':140,152,193,1585,1962 'xml':1249 'yourdomain.com':1868","prices":[{"id":"dc9590c7-392d-4bd5-958a-8fab6b4889c8","listingId":"8d271182-3701-4c52-85c8-8fa2813d757a","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"dpearson2699","category":"swift-ios-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T20:34:43.081Z"}],"sources":[{"listingId":"8d271182-3701-4c52-85c8-8fa2813d757a","source":"github","sourceId":"dpearson2699/swift-ios-skills/app-clips","sourceUrl":"https://github.com/dpearson2699/swift-ios-skills/tree/main/skills/app-clips","isPrimary":false,"firstSeenAt":"2026-04-18T22:00:41.416Z","lastSeenAt":"2026-04-22T00:53:41.192Z"},{"listingId":"8d271182-3701-4c52-85c8-8fa2813d757a","source":"skills_sh","sourceId":"dpearson2699/swift-ios-skills/app-clips","sourceUrl":"https://skills.sh/dpearson2699/swift-ios-skills/app-clips","isPrimary":true,"firstSeenAt":"2026-04-18T20:34:43.081Z","lastSeenAt":"2026-04-22T03:40:33.904Z"}],"details":{"listingId":"8d271182-3701-4c52-85c8-8fa2813d757a","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"dpearson2699","slug":"app-clips","source":"skills_sh","category":"swift-ios-skills","skills_sh_url":"https://skills.sh/dpearson2699/swift-ios-skills/app-clips"},"updatedAt":"2026-04-22T03:40:33.904Z"}}