axiom-app-discoverability by charleswiltgen/axiom
npx skills add https://github.com/charleswiltgen/axiom --skill axiom-app-discoverability核心原则 通过多个 API 向系统提供元数据,让系统决定何时展示您的应用。
iOS 根据您通过 App Intents、App Shortcuts、Core Spotlight 和 NSUserActivity 提供的元数据,在 Spotlight、Siri 建议和系统体验中展示应用。系统会从实际使用中学习,并提升常用操作的优先级。没有任何单一 API 是足够的——全面的可发现性需要采用多 API 策略。
关键洞察 iOS 会提升用户实际调用的快捷方式和活动。如果没有人使用某个意图,系统会将其隐藏。提供清晰、面向操作的元数据,系统会完成繁重的工作。
在以下情况下使用此技能:
在以下情况下请勿使用此技能:
这是来自在多个生产应用中实现了可发现性的开发者的经过验证的策略。实施时间:一个晚上实现最小可行的可发现性。
App Intents 为 Spotlight 搜索、Siri 请求和快捷方式建议提供支持。没有 AppIntents,您的应用将永远无法有意义地展示。
struct OrderCoffeeIntent: AppIntent {
static var title: LocalizedStringResource = "Order Coffee"
static var description = IntentDescription("Orders coffee for pickup")
@Parameter(title: "Coffee Type")
var coffeeType: CoffeeType
@Parameter(title: "Size")
var size: CoffeeSize
func perform() async throws -> some IntentResult {
try await CoffeeService.shared.order(type: coffeeType, size: size)
return .result(dialog: "Your \(size) \(coffeeType) is ordered")
}
}
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
为什么这很重要 App Intents 是基础。其他一切都建立在它们之上。
参见:app-intents-ref 获取完整的 API 参考
App Shortcuts 使您的意图在安装后立即可用。无需配置。
struct CoffeeAppShortcuts: AppShortcutsProvider {
@AppShortcutsBuilder
static var appShortcuts: [AppShortcut] {
AppShortcut(
intent: OrderCoffeeIntent(),
phrases: [
"Order coffee in \(.applicationName)",
"Get my usual coffee from \(.applicationName)"
],
shortTitle: "Order Coffee",
systemImageName: "cup.and.saucer.fill"
)
}
static var shortcutTileColor: ShortcutTileColor = .tangerine
}
为什么这很重要 没有 App Shortcuts,用户必须手动配置快捷方式。有了它们,您的操作会立即出现在 Siri、Spotlight、操作按钮和控制中心中。
关键 使用 suggestedPhrase 模式——这会增加系统在 Spotlight 操作建议和 Siri 轮播中提出它们的几率。
参见:app-shortcuts-ref 获取短语模式和最佳实践
索引重要的内容。系统将展示与用户查询匹配的项目。
import CoreSpotlight
import UniformTypeIdentifiers
func indexOrder(_ order: Order) {
let attributes = CSSearchableItemAttributeSet(contentType: .item)
attributes.title = order.coffeeName
attributes.contentDescription = "Order from \(order.date.formatted())"
attributes.keywords = ["coffee", "order", order.coffeeName]
let item = CSSearchableItem(
uniqueIdentifier: order.id.uuidString,
domainIdentifier: "orders",
attributeSet: attributes
)
CSSearchableIndex.default().indexSearchableItems([item]) { error in
if let error = error {
print("Indexing error: \(error)")
}
}
}
为什么这很重要 Core Spotlight 使您应用的内容可搜索。当用户在 Spotlight 中搜索“拿铁”时,您应用的订单会出现。
仅索引重要的内容 不要索引所有内容。专注于面向用户的内容(订单、文档、笔记等)。
参见:core-spotlight-ref 获取批处理、删除模式和最佳实践
将重要屏幕标记为符合搜索和预测条件。
func viewOrder(_ order: Order) {
let activity = NSUserActivity(activityType: "com.coffeeapp.viewOrder")
activity.title = order.coffeeName
activity.isEligibleForSearch = true
activity.isEligibleForPrediction = true
activity.persistentIdentifier = order.id.uuidString
// 连接到 App Intents
activity.appEntityIdentifier = order.id.uuidString
// 提供丰富的元数据
let attributes = CSSearchableItemAttributeSet(contentType: .item)
attributes.contentDescription = "Your \(order.coffeeName) order"
attributes.thumbnailData = order.imageData
activity.contentAttributeSet = attributes
activity.becomeCurrent()
// 在您的视图控制器或 SwiftUI 视图中
self.userActivity = activity
}
为什么这很重要 系统会学习用户经常访问哪些屏幕,并主动建议它们。锁屏小组件、Siri 建议和 Spotlight 都会受益。
关键 仅标记用户希望返回的屏幕。不要标记设置、引导流程或错误状态。
参见:core-spotlight-ref 获取资格模式和活动延续
清晰的描述和标题至关重要,因为 Spotlight 会直接显示它们。
static var title: LocalizedStringResource = "Do Thing"
static var description = IntentDescription("Performs action")
static var title: LocalizedStringResource = "Order Coffee"
static var description = IntentDescription("Orders coffee for pickup")
参数摘要必须是自然语言:
static var parameterSummary: some ParameterSummary {
Summary("Order \(\.$size) \(\.$coffeeType)")
}
// Siri: "Order large latte"
为什么这很重要 糟糕的元数据意味着用户不会理解您的意图是做什么的。清晰的元数据 = 更高的使用率 = 系统会提升它。
系统会提升用户实际调用的快捷方式和活动。如果没有人使用某个意图,系统会将其隐藏。
这是自动的——您无法控制它。您可以控制的是:
// 在应用内推广您的快捷方式
SiriTipView(intent: OrderCoffeeIntent(), isVisible: $showTip)
.siriTipViewStyle(.dark)
为什么这很重要 即使用户不知道快捷方式存在,完美的元数据也无济于事。在您的应用 UI 中教育用户。
参见:app-shortcuts-ref 获取 SiriTipView 和 ShortcutsLink 模式
┌─ 需要公开应用功能吗? ────────────────────────────────┐
│ │
│ ┌─ 是 → App Intents (AppIntent 协议) │
│ │ └─ 希望无需用户设置即可立即可用吗? │
│ │ └─ 是 → App Shortcuts (AppShortcutsProvider) │
│ │ │
│ └─ 否 → 公开应用内容(而非操作)? │
│ │ │
│ ├─ 用户发起的活动(查看屏幕)? │
│ │ └─ 是 → NSUserActivity with isEligibleForSearch │
│ │ │
│ └─ 索引所有内容(文档、订单、笔记)? │
│ └─ 是 → Core Spotlight (CSSearchableItem) │
│ │
│ ┌─ 已经在使用 App Intents 了吗? │
│ │ └─ 希望为实体自动进行 Spotlight 搜索吗? │
│ │ └─ 是 → IndexedEntity 协议 │
│ │ │
│ └─ 希望将屏幕连接到 App Intent 实体吗? │
│ └─ 是 → NSUserActivity.appEntityIdentifier │
└──────────────────────────────────────────────────────────────────┘
| 用例 | API | 示例 |
|---|---|---|
| 向 Siri/快捷方式公开操作 | AppIntent | "点咖啡" |
| 立即使操作可用 | AppShortcut | 立即出现在 Spotlight 中 |
| 索引所有应用内容 | CSSearchableItem | 所有咖啡订单可搜索 |
| 标记当前屏幕为重要 | NSUserActivity | 用户查看订单详情 |
| 自动生成查找操作 | IndexedEntity | "查找...的订单" |
| 将屏幕链接到 App Intent | appEntityIdentifier | 深度链接到特定订单 |
实现最小可行的可发现性:
// 您应用最有价值的操作
struct OrderCoffeeIntent: AppIntent { /* ... */ }
struct ReorderLastIntent: AppIntent { /* ... */ }
struct ViewOrdersIntent: AppIntent { /* ... */ }
struct CoffeeAppShortcuts: AppShortcutsProvider {
@AppShortcutsBuilder
static var appShortcuts: [AppShortcut] {
AppShortcut(
intent: OrderCoffeeIntent(),
phrases: ["Order coffee in \(.applicationName)"],
shortTitle: "Order",
systemImageName: "cup.and.saucer.fill"
)
// 添加 2-3 个更多快捷方式
}
}
// 仅索引最近/重要的内容
func indexRecentOrders() {
let recentOrders = try await OrderService.shared.recent(limit: 20)
let items = recentOrders.map { createSearchableItem(from: $0) }
CSSearchableIndex.default().indexSearchableItems(items)
}
// 在您的详情视图控制器/视图中
let activity = NSUserActivity(activityType: "com.app.viewOrder")
activity.isEligibleForSearch = true
activity.becomeCurrent()
self.userActivity = activity
总时间:约 2 小时 实现基本可发现性
当索引 1,000 个以上项目时,分批索引以避免启动速度变慢:
func indexAllContent() async {
let allItems = try await ContentService.shared.all()
let batchSize = 100
for batch in stride(from: 0, to: allItems.count, by: batchSize) {
let slice = Array(allItems[batch..<min(batch + batchSize, allItems.count)])
let searchableItems = slice.map { createSearchableItem(from: $0) }
CSSearchableIndex.default().indexSearchableItems(searchableItems) { error in
if let error { print("Batch index error: \(error)") }
}
// 在批次之间让步以避免阻塞
try? await Task.sleep(for: .milliseconds(50))
}
}
最佳实践:
domainIdentifier 对内容进行分组,以便高效批量删除CSSearchableIndex.beginBatch() / endBatch() 进行原子更新当索引的内容未出现在 Spotlight 中时:
indexSearchableItems 添加完成处理程序日志记录contentType —— 对一般内容使用 .item;错误的类型可能影响排名| 问题 | 原因 | 修复 |
|---|---|---|
| 内容未出现 | 缺少 title 属性 | 始终设置 attributeSet.title |
| 排名低 | 没有关键词 | 添加相关的 keywords 数组 |
| 过时结果 | 未删除已移除的项目 | 调用 deleteSearchableItems(withIdentifiers:) |
| 重复结果 | 不稳定的唯一标识符 | 使用持久 ID(UUID、数据库主键) |
| 超出配额 | 索引了太多项目 | 限制为用户相关的内容(最近的、收藏的) |
// 验证项目是否已索引
CSSearchableIndex.default().fetchLastClientState { state, error in
print("Last client state: \(String(describing: state))")
}
// 通过编程方式搜索以验证
let query = CSSearchQuery(queryString: "title == 'My Item'*", attributes: ["title"])
query.foundItemsHandler = { items in
print("Found \(items.count) items")
}
query.start()
问题 用户必须手动配置快捷方式。您的应用不会自动出现在 Spotlight/Siri 中。
修复 始终使用建议短语创建 AppShortcutsProvider。
问题 索引数千个项目会导致性能不佳和配额问题。用户会感到不知所措。
// ❌ 错误:索引所有 10,000 个订单
let allOrders = try await OrderService.shared.all()
修复 选择性索引——最近的项目、收藏夹、频繁访问的内容。
// ✅ 正确:仅索引最近的订单
let recentOrders = try await OrderService.shared.recent(limit: 50)
问题 Spotlight 直接显示这些内容。通用文本会使用户困惑。
// ❌ 错误
static var title: LocalizedStringResource = "Action"
static var description = IntentDescription("Does something")
修复 使用具体、面向操作的语言。
// ✅ 正确
static var title: LocalizedStringResource = "Order Coffee"
static var description = IntentDescription("Orders your favorite coffee for pickup")
问题 完美的实现毫无意义,如果用户不知道它的存在。
修复 使用 SiriTipView 在您的应用 UI 中推广快捷方式。
// 在用户下订单后显示提示
SiriTipView(intent: ReorderLastIntent(), isVisible: $showTip)
问题 系统会混淆什么是重要的。低质量的建议。
// ❌ 错误:设置屏幕标记为可预测
activity.isEligibleForPrediction = true // 不要预测设置!
修复 仅标记用户希望返回的屏幕(内容,而非界面元素)。
// ✅ 正确:仅标记内容屏幕
if order != nil {
activity.isEligibleForPrediction = true
}
问题 NSUserActivity 和 App Intents 保持孤立。失去了集成机会。
修复 使用 appEntityIdentifier 连接它们。
// ✅ 正确:将活动连接到 App Intent 实体
activity.appEntityIdentifier = order.id.uuidString
审查可发现性实现时,请验证:
App Intents:
isDiscoverable = trueApp Shortcuts:
\(.applicationName)Core Spotlight:
NSUserActivity:
becomeCurrent()resignCurrent()appEntityIdentifier 连接到 App Intent 实体contentAttributeSet 提供丰富的元数据用户教育:
测试:
WWDC:260, 275, 2022-10170
文档:/appintents/making-your-app-s-functionality-available-to-siri, /corespotlight
技能:axiom-app-intents-ref, axiom-app-shortcuts-ref, axiom-core-spotlight-ref
记住 可发现性不是一个 API——它是一种策略。通过 App Intents、App Shortcuts、Core Spotlight 和 NSUserActivity 向系统提供元数据。让 iOS 根据上下文和用户行为决定何时展示您的应用。
每周安装量
100
代码仓库
GitHub 星标数
610
首次出现
2026年1月21日
安全审计
安装于
opencode81
codex78
claude-code75
gemini-cli74
cursor73
github-copilot69
Core principle Feed the system metadata across multiple APIs, let the system decide when to surface your app.
iOS surfaces apps in Spotlight, Siri suggestions, and system experiences based on metadata you provide through App Intents, App Shortcuts, Core Spotlight, and NSUserActivity. The system learns from actual usage and boosts frequently-used actions. No single API is sufficient—comprehensive discoverability requires a multi-API strategy.
Key insight iOS boosts shortcuts and activities that users actually invoke. If nobody uses an intent, the system hides it. Provide clear, action-oriented metadata and the system does the heavy lifting.
Use this skill when:
Do NOT use this skill when:
This is a proven strategy from developers who've implemented discoverability across multiple production apps. Implementation time: One evening for minimal viable discoverability.
App Intents power Spotlight search, Siri requests, and Shortcut suggestions. Without AppIntents, your app will never surface meaningfully.
struct OrderCoffeeIntent: AppIntent {
static var title: LocalizedStringResource = "Order Coffee"
static var description = IntentDescription("Orders coffee for pickup")
@Parameter(title: "Coffee Type")
var coffeeType: CoffeeType
@Parameter(title: "Size")
var size: CoffeeSize
func perform() async throws -> some IntentResult {
try await CoffeeService.shared.order(type: coffeeType, size: size)
return .result(dialog: "Your \(size) \(coffeeType) is ordered")
}
}
Why this matters App Intents are the foundation. Everything else builds on them.
See: app-intents-ref for complete API reference
App Shortcuts make your intents instantly available after install. No configuration required.
struct CoffeeAppShortcuts: AppShortcutsProvider {
@AppShortcutsBuilder
static var appShortcuts: [AppShortcut] {
AppShortcut(
intent: OrderCoffeeIntent(),
phrases: [
"Order coffee in \(.applicationName)",
"Get my usual coffee from \(.applicationName)"
],
shortTitle: "Order Coffee",
systemImageName: "cup.and.saucer.fill"
)
}
static var shortcutTileColor: ShortcutTileColor = .tangerine
}
Why this matters Without App Shortcuts, users must manually configure shortcuts. With them, your actions appear immediately in Siri, Spotlight, Action Button, and Control Center.
Critical Use suggestedPhrase patterns—this increases the chance that the system proposes them in Spotlight action suggestions and Siri's carousel.
See: app-shortcuts-ref for phrase patterns and best practices
Index content that matters. The system will surface items that match user queries.
import CoreSpotlight
import UniformTypeIdentifiers
func indexOrder(_ order: Order) {
let attributes = CSSearchableItemAttributeSet(contentType: .item)
attributes.title = order.coffeeName
attributes.contentDescription = "Order from \(order.date.formatted())"
attributes.keywords = ["coffee", "order", order.coffeeName]
let item = CSSearchableItem(
uniqueIdentifier: order.id.uuidString,
domainIdentifier: "orders",
attributeSet: attributes
)
CSSearchableIndex.default().indexSearchableItems([item]) { error in
if let error = error {
print("Indexing error: \(error)")
}
}
}
Why this matters Core Spotlight makes your app's content searchable. When users search for "latte" in Spotlight, your app's orders appear.
Index only what matters Don't index everything. Focus on user-facing content (orders, documents, notes, etc.).
See: core-spotlight-ref for batching, deletion patterns, and best practices
Mark important screens as eligible for search and prediction.
func viewOrder(_ order: Order) {
let activity = NSUserActivity(activityType: "com.coffeeapp.viewOrder")
activity.title = order.coffeeName
activity.isEligibleForSearch = true
activity.isEligibleForPrediction = true
activity.persistentIdentifier = order.id.uuidString
// Connect to App Intents
activity.appEntityIdentifier = order.id.uuidString
// Provide rich metadata
let attributes = CSSearchableItemAttributeSet(contentType: .item)
attributes.contentDescription = "Your \(order.coffeeName) order"
attributes.thumbnailData = order.imageData
activity.contentAttributeSet = attributes
activity.becomeCurrent()
// In your view controller or SwiftUI view
self.userActivity = activity
}
Why this matters The system learns which screens users visit frequently and suggests them proactively. Lock screen widgets, Siri suggestions, and Spotlight all benefit.
Critical Only mark screens that users would want to return to. Not settings, not onboarding, not error states.
See: core-spotlight-ref for eligibility patterns and activity continuation
Clear descriptions and titles are critical because Spotlight displays them directly.
static var title: LocalizedStringResource = "Do Thing"
static var description = IntentDescription("Performs action")
static var title: LocalizedStringResource = "Order Coffee"
static var description = IntentDescription("Orders coffee for pickup")
Parameter summaries must be natural language:
static var parameterSummary: some ParameterSummary {
Summary("Order \(\.$size) \(\.$coffeeType)")
}
// Siri: "Order large latte"
Why this matters Poor metadata means users won't understand what your intent does. Clear metadata = higher usage = system boosts it.
The system boosts shortcuts and activities that users actually invoke. If nobody uses an intent, the system hides it.
This is automatic—you don't control it. What you control:
// Promote your shortcuts in-app
SiriTipView(intent: OrderCoffeeIntent(), isVisible: $showTip)
.siriTipViewStyle(.dark)
Why this matters Even perfect metadata won't help if users don't know shortcuts exist. Educate users in your app's UI.
See: app-shortcuts-ref for SiriTipView and ShortcutsLink patterns
┌─ Need to expose app functionality? ────────────────────────────────┐
│ │
│ ┌─ YES → App Intents (AppIntent protocol) │
│ │ └─ Want instant availability without user setup? │
│ │ └─ YES → App Shortcuts (AppShortcutsProvider) │
│ │ │
│ └─ NO → Exposing app CONTENT (not actions)? │
│ │ │
│ ├─ User-initiated activity (viewing screen)? │
│ │ └─ YES → NSUserActivity with isEligibleForSearch │
│ │ │
│ └─ Indexing all content (documents, orders, notes)? │
│ └─ YES → Core Spotlight (CSSearchableItem) │
│ │
│ ┌─ Already using App Intents? │
│ │ └─ Want automatic Spotlight search for entities? │
│ │ └─ YES → IndexedEntity protocol │
│ │ │
│ └─ Want to connect screen to App Intent entity? │
│ └─ YES → NSUserActivity.appEntityIdentifier │
└──────────────────────────────────────────────────────────────────┘
| Use Case | API | Example |
|---|---|---|
| Expose action to Siri/Shortcuts | AppIntent | "Order coffee" |
| Make action available instantly | AppShortcut | Appear in Spotlight immediately |
| Index all app content | CSSearchableItem | All coffee orders searchable |
| Mark current screen important | NSUserActivity | User viewing order detail |
| Auto-generate Find actions | IndexedEntity |
For minimal viable discoverability:
// Your app's most valuable actions
struct OrderCoffeeIntent: AppIntent { /* ... */ }
struct ReorderLastIntent: AppIntent { /* ... */ }
struct ViewOrdersIntent: AppIntent { /* ... */ }
struct CoffeeAppShortcuts: AppShortcutsProvider {
@AppShortcutsBuilder
static var appShortcuts: [AppShortcut] {
AppShortcut(
intent: OrderCoffeeIntent(),
phrases: ["Order coffee in \(.applicationName)"],
shortTitle: "Order",
systemImageName: "cup.and.saucer.fill"
)
// Add 2-3 more shortcuts
}
}
// Index most recent/important content only
func indexRecentOrders() {
let recentOrders = try await OrderService.shared.recent(limit: 20)
let items = recentOrders.map { createSearchableItem(from: $0) }
CSSearchableIndex.default().indexSearchableItems(items)
}
// In your detail view controllers/views
let activity = NSUserActivity(activityType: "com.app.viewOrder")
activity.isEligibleForSearch = true
activity.becomeCurrent()
self.userActivity = activity
Total time: ~2 hours for basic discoverability
When indexing 1,000+ items, index in batches to avoid launch slowdowns:
func indexAllContent() async {
let allItems = try await ContentService.shared.all()
let batchSize = 100
for batch in stride(from: 0, to: allItems.count, by: batchSize) {
let slice = Array(allItems[batch..<min(batch + batchSize, allItems.count)])
let searchableItems = slice.map { createSearchableItem(from: $0) }
CSSearchableIndex.default().indexSearchableItems(searchableItems) { error in
if let error { print("Batch index error: \(error)") }
}
// Yield between batches to avoid blocking
try? await Task.sleep(for: .milliseconds(50))
}
}
Best practices :
domainIdentifier to group content for efficient bulk deletionCSSearchableIndex.beginBatch() / endBatch() for atomic updatesWhen indexed content doesn't appear in Spotlight:
indexSearchableItemscontentType — Use .item for general content; wrong type may affect ranking| Problem | Cause | Fix |
|---|---|---|
| Content not appearing | Missing title attribute | Always set attributeSet.title |
| Low ranking | No keywords | Add relevant keywords array |
| Stale results | Not deleting removed items | Call deleteSearchableItems(withIdentifiers:) |
| Duplicate results | Unstable unique identifiers | Use persistent IDs (UUID, database primary key) |
| Quota exceeded | Indexing too many items | Limit to user-relevant content (recent, favorited) |
// Verify items are indexed
CSSearchableIndex.default().fetchLastClientState { state, error in
print("Last client state: \(String(describing: state))")
}
// Search programmatically to verify
let query = CSSearchQuery(queryString: "title == 'My Item'*", attributes: ["title"])
query.foundItemsHandler = { items in
print("Found \(items.count) items")
}
query.start()
Problem Users must manually configure shortcuts. Your app won't appear in Spotlight/Siri automatically.
Fix Always create AppShortcutsProvider with suggested phrases.
Problem Indexing thousands of items causes poor performance and quota issues. Users get overwhelmed.
// ❌ BAD: Index all 10,000 orders
let allOrders = try await OrderService.shared.all()
Fix Index selectively—recent items, favorites, frequently accessed.
// ✅ GOOD: Index recent orders only
let recentOrders = try await OrderService.shared.recent(limit: 50)
Problem Spotlight displays these directly. Generic text confuses users.
// ❌ BAD
static var title: LocalizedStringResource = "Action"
static var description = IntentDescription("Does something")
Fix Use specific, action-oriented language.
// ✅ GOOD
static var title: LocalizedStringResource = "Order Coffee"
static var description = IntentDescription("Orders your favorite coffee for pickup")
Problem Perfect implementation means nothing if users don't know it exists.
Fix Use SiriTipView to promote shortcuts in your app's UI.
// Show tip after user places order
SiriTipView(intent: ReorderLastIntent(), isVisible: $showTip)
Problem System gets confused about what's important. Low-quality suggestions.
// ❌ BAD: Settings screen marked for prediction
activity.isEligibleForPrediction = true // Don't predict Settings!
Fix Only mark screens users would want to return to (content, not chrome).
// ✅ GOOD: Mark content screens only
if order != nil {
activity.isEligibleForPrediction = true
}
Problem NSUserActivity and App Intents remain siloed. Lost integration opportunities.
Fix Use appEntityIdentifier to connect them.
// ✅ GOOD: Connect activity to App Intent entity
activity.appEntityIdentifier = order.id.uuidString
When reviewing discoverability implementation, verify:
App Intents:
isDiscoverable = true for public intentsApp Shortcuts:
\(.applicationName)Core Spotlight:
NSUserActivity:
becomeCurrent() called when screen appearsresignCurrent() called when screen disappearsappEntityIdentifier connects to App Intent entitiescontentAttributeSet provides rich metadataUser Education:
Testing:
WWDC : 260, 275, 2022-10170
Docs : /appintents/making-your-app-s-functionality-available-to-siri, /corespotlight
Skills : axiom-app-intents-ref, axiom-app-shortcuts-ref, axiom-core-spotlight-ref
Remember Discoverability isn't one API—it's a strategy. Feed the system metadata across App Intents, App Shortcuts, Core Spotlight, and NSUserActivity. Let iOS decide when to surface your app based on context and user behavior.
Weekly Installs
100
Repository
GitHub Stars
610
First Seen
Jan 21, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
opencode81
codex78
claude-code75
gemini-cli74
cursor73
github-copilot69
Google Calendar 命令行工具:轻量级集成与自动化管理,支持 OAuth 身份验证
131 周安装
Laravel开发专家技能:PHP最佳实践、Eloquent ORM、API构建与Web开发解决方案
138 周安装
WCAG 无障碍审计工具 - 网页可访问性合规检测与评估指南 (WCAG 2.1/2.2)
212 周安装
Mantine Form 表单库:React 表单验证与状态管理解决方案 | 开源 UI 组件
246 周安装
英式商务英语写作指南 | 专业商务沟通、英式拼写与邮件礼仪
234 周安装
高级质量保证工程师技能:自动化测试、缺陷管理与CI/CD集成
122 周安装
| "Find orders where..." |
| Link screen to App Intent | appEntityIdentifier | Deep link to specific order |