Siri, Shortcuts, widgets et intents système
Copiez un prompt de configuration incluant les étapes d'installation et le guide markdown complet pour ce plugin.
Expo a récemment publié expo-app-intents, qui connecte le framework App Intents d'Apple à JavaScript : les phrases Siri et Shortcuts, les catalogues d'entités au runtime, les schémas d'app Apple pour Apple Intelligence, l'indexation Spotlight et une file d'attente native pour les invocations qui arrivent avant le démarrage de JavaScript.
@capgo/capacitor-app-intents est le pont Capacitor pour Apple App Intents: les phrases Siri et Shortcuts (via codegen à la compilation), les catalogues d'entités au runtime, l'indexation Spotlight, les actions rapides de l'écran d'accueil et une file d'attente des invocations en attente lors des cold starts. Widget Kit, Live Activities, Share Target et Intent Launcher couvrent toujours les adjacentes surfaces. Cette page explique comment ils s'articulent pour vous permettre de déployer des intégrations système sans mélanger Android Intent Des API avec Apple App Intents.
Carte rapide
Section intitulée « Cartographie rapide »| Interface système | plugin Capgo | Ce que fait réellement le plugin |
|---|---|---|
| Widgets de l'écran d'accueil, Live Activities sur l'écran de verrouillage, Dynamic Island (widget SVG ou natif code) | @capgo/capacitor-widget-kit | Persistez les activités de template, exécutez des actions déclaratives, loguez les clics sur les widgets ou Live Activity, et synchronisez les sessions de widgets full-native via les App Groups. |
| Live Activities avec des arbres de mise en page JSON | @capgo/capacitor-live-activities | Lancez, mettez à jour et terminez les activités ActivityKit depuis Capacitor ; séquences de minuteurs ; partage d'images via App Group. |
| Recevoir des partages d'autres applications | @capgo/capacitor-share-target | shareReceived événements pour le titre, le texte et les fichiers via les intents Android ou une Share Extension iOS avec App Group. |
| Ouvrir les paramètres ou les activités Android ; ouvrir les URL des réglages iOS | @capgo/capacitor-intent-launcher | startActivityAsync, openIOSSettings, openApplication. Il ne s'agit pas d'Apple App Intents. |
| Phrases Siri, Shortcuts, Spotlight, actions rapides, file d'attente App Intent | @capgo/capacitor-app-intents | Envoyer au bridge, setEntityCatalog, indexSpotlightEntities, setHomeScreenShortcutItems, getPendingInvocations, useAppIntentsListener. iOS 16+. |
| LLM local (Apple Intelligence sur les iPhone compatibles) | @capgo/capacitor-llm | APIs de chat et de modèles. Aucun pont App Intent ou schéma requis. |
Comparaison avec expo-app-intents
Section intitulée « Comparaison avec expo-app-intents »Utilisez ce tableau pour évaluer la parité. Les lignes marquées partiel signifient que seule une petite partie se recoupe.
| capacité expo-app-intents | Capgo aujourd'hui |
|---|---|
| Actions personnalisées dans Siri et l'app Raccourcis via des commandes vocales | Oui par @capgo/capacitor-app-intents. Les phrases sont littéraux à la compilation dans le Swift généré (AppShortcutsProvider), et non des chaînes JavaScript au runtime. |
Paramètres de raccourci basés sur des catalogues d'entités JS (AppEntity, EntityQuery) | Oui par @capgo/capacitor-app-intents via setEntityCatalog() et natifs EntityQuery câblage. |
| Les schémas d'app Apple (par exemple les intents de brouillon d'e-mail pour Apple Intelligence) | Partiel. App Intents expose performAppleSchemaTemplate comme une file d'attente JavaScript uniquement (pas de API natif pour Mail). Vous implémentez l'interface de composition ou les deep links dans votre app. |
| L'indexation Spotlight et le contenu d'app recherchable | Oui par @capgo/capacitor-app-intents via indexSpotlightEntities() (CSSearchableItem, ainsi que IndexedEntity sur iOS 18+). |
| Associer le contenu à l’écran à des entités pour l’intelligence système | Partiel. Les catalogues d’entités alimentent les paramètres de Shortcuts ; les API d’association à l’écran ne sont pas encore exposées. |
| File d’attente native pour les actions déclenchées avant que JavaScript ne soit prêt | Oui pour App Intents via @capgo/capacitor-app-intents (getPendingInvocations, appIntentInvoked). Share Target et Widget Kit utilisent toujours leurs propres modèles de rétention pour les partages et les événements de modèle. |
| Boutons interactifs pour Live Activity ou widgets via App Intents | Partiel. Widget Kit fournit CapgoTemplateActionIntent et CompleteSetIntent comme LiveActivityIntent des types pour modèle les actions hotspot et workout sur iOS 17+. Elles mettent à jour l'état natif et le log d'événements ; elles n'exposent pas de phrases Siri arbitraires depuis le JavaScript. |
| WidgetKit et ActivityKit depuis le JavaScript de l'app | Oui. les plugins Widget Kit et Live Activities (voir ci-dessous). |
Android Intent actions (settings, VIEW, SEND et similaires) | Oui pour le lancement et la réception via Intent Launcher et Share Target. |
Widget Kit : widgets, Live Activities et actions de template
Section intitulée « Widget Kit : widgets, Live Activities et actions de template »@capgo/capacitor-widget-kit est ce qui se rapproche le plus de l'UI visible par le système en dehors de votre WebView. Vous pouvez piloter l'écran de verrouillage et la Dynamic Island depuis Capacitor, afficher des widgets sur l'écran d'accueil à partir de templates SVG ou de code natifs en Swift/Kotlin, et traiter les taps après coup.
Lancer une Live Activity de template et gérer les actions en JavaScript
Section intitulée « Démarrer une Live Activity de template et gérer les actions en JavaScript »Enregistrez un listener au démarrage de l'app, puis faites un polling ou un appel après App resume because widget taps may run while the WebView is still loading:
import { App } from '@capacitor/app';import { CapgoWidgetKit } from '@capgo/capacitor-widget-kit';
const ACTIVITY_ID = 'order-tracker';
async function drainTemplateEvents() { const { events } = await CapgoWidgetKit.listTemplateEvents({ activityId: ACTIVITY_ID, unacknowledgedOnly: true, });
for (const event of events) { if (event.actionId === 'mark-delivered') { // Update your app state from event.state or event.payload } await CapgoWidgetKit.acknowledgeTemplateEvents({ eventIds: [event.eventId], }); }}
await CapgoWidgetKit.startTemplateActivity({ activityId: ACTIVITY_ID, state: { status: 'On the way' }, definition: { id: 'delivery-card', actions: [ { id: 'mark-delivered', eventName: 'delivery.marked', }, ], layouts: { lockScreen: { width: 200, height: 80, svg: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 80"><text x="8" y="40">{{state.status}}</text></svg>', hotspots: [ { id: 'deliver', actionId: 'mark-delivered', x: 120, y: 20, width: 70, height: 40, label: 'Mark delivered', }, ], }, }, },});
App.addListener('resume', () => { void drainTemplateEvents();});
void drainTemplateEvents();Sur iOS, les contrôles interactifs de l'extension de widget peuvent appeler le bundle CapgoTemplateActionIntent (LiveActivityIntent). Ce chemin met à jour l'état du template stocké et l'ajoute au même journal d'événements que votre JavaScript lit. Il est pas l'équivalent de l'ajout d'une phrase de raccourci visible par l'utilisateur dans l'application Raccourcis.
Consultez Démarrer avec WidgetKit pour la configuration de l'App Group et les sessions de widgets full-native.
Live Activities : layouts JSON depuis Capacitor
Section intitulée « Live Activities : layouts JSON de Capacitor »@capgo/capacitor-live-activities se concentre sur ActivityKit avec un JSON de layout déclaratif (texte, images, minuteurs, jauges, zones Dynamic Island). Il n'enregistre pas d'App Intents ni de raccourcis Siri.
import { CapgoLiveActivities } from '@capgo/capacitor-live-activities';
const { supported } = await CapgoLiveActivities.areActivitiesSupported();if (!supported) { return;}
const { activityId } = await CapgoLiveActivities.startActivity({ layout: { type: 'container', direction: 'vertical', children: [ { type: 'text', content: 'Order {{orderId}}', fontWeight: 'bold' }, { type: 'text', content: '{{status}}' }, ], }, data: { orderId: '42', status: 'Preparing' },});
await CapgoLiveActivities.updateActivity({ activityId, data: { orderId: '42', status: 'Out for delivery' },});Choisissez Activités en direct when you want the layout DSL and image helpers. Choose WidgetKit lorsque vous avez besoin de widgets d’écran d’accueil, de cadres SVG ou du journal d’événements du modèl’et LiveActivityIntent boutons.
Share Target : partages entrants (pas les Shortcuts sortants)
Section intitulée « Share Target : partages entrants (pas les Shortcuts sortants) »@capgo/capacitor-share-target permet à d’autres applications d’envoyer du contenu en votre application. Sur iOS, vous ajoutez une extension de partage qui écrit dans un App Group ; le plugin principal de l’app lit et vide ce payload, puis émet shareReceived.
Le démarrage à froid est géré sur iOS : le plugin natif appelle notifyListeners(..., retainUntilConsumed: true) ainsi, le premier listener JavaScript reçoit toujours l'événement.
import { CapacitorShareTarget } from '@capgo/capacitor-share-target';
await CapacitorShareTarget.addListener('shareReceived', (event) => { const firstText = event.texts[0] ?? ''; const firstFile = event.files[0]; console.log(event.title, firstText, firstFile?.uri);});Cela complète les filtres d'intent Android. SEND les intent filters. Il effectue pas publier des raccourcis de partage ou des actions Siri depuis votre app.
Intent Launcher : intents Android et réglages iOS (pas les App Intents)
Section intitulée « Intent Launcher : intents Android et Réglages iOS (et non App Intents) »Le nom est facilement confondu avec Apple App Intents. @capgo/capacitor-intent-launcher ne lance que Android activités (y compris ActivityAction.CREATE_SHORTCUT pour les anciens raccourcis du launcher) et ouvre Réglages iOS Les URL schemes.
import { IntentLauncher, ActivityAction, IOSSettings } from '@capgo/capacitor-intent-launcher';
await IntentLauncher.startActivityAsync({ action: ActivityAction.WIFI_SETTINGS,});
await IntentLauncher.openIOSSettings({ option: IOSSettings.App });Pour Siri, l'app Raccourcis et AppIntent types, utilisez @capgo/capacitor-app-intents. Intent Launcher lance uniquement les activités Android et les URL des Réglages iOS.
Combinaisons suggérées
Section intitulée « Combinaisons suggérées »| Objectif | Commencer ici |
|---|---|
| Écran de verrouillage et Dynamic Island avec SVG et logs de tap | WidgetKit |
| JSON de layout riche et séquences de timer | Activités en direct |
| L'utilisateur partage un lien ou un fichier dans votre app | Cible de partage |
| Deep link vers les réglages Wi-Fi ou de l'app | Lancement d'intentions |
| Phrase Siri qui exécute votre handler JS avec des paramètres d'entité | App Intents (codegen pour les phrases, setEntityCatalog, useAppIntentsListener) |
Lacunes restantes (pour la planification)
Section intitulée « Lacunes restantes (pour la planification) »| Domaine | Statut |
|---|---|
Widget Kit personnalisé AppShortcut phrases liées au log d'événements du template | Widget Kit embarque encore LiveActivityIntent uniquement des helpers ; les phrases Siri arbitraires relèvent de la codegen App Intents. |
| Polling du Share Target API | Événements uniquement pour l'instant ; utilisez addListener('shareReceived') tôt au démarrage. |
| Intents de schéma Apple Mail natif | Non disponible pour les applications tierces ; App Intents met à la place un handler JS en file d'attente. |
| Parité des App Intents sur Android | App Intents n'est disponible que sur iOS 16+ ; Android renvoie une erreur explicite. |