Aller au contenu

Siri, Shortcuts, widgets et intents système

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.

Interface systèmeplugin CapgoCe 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-kitPersistez 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-activitiesLancez, 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-targetshareReceived é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-launcherstartActivityAsync, 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-intentsEnvoyer au bridge, setEntityCatalog, indexSpotlightEntities, setHomeScreenShortcutItems, getPendingInvocations, useAppIntentsListener. iOS 16+.
LLM local (Apple Intelligence sur les iPhone compatibles)@capgo/capacitor-llmAPIs de chat et de modèles. Aucun pont App Intent ou schéma requis.

Utilisez ce tableau pour évaluer la parité. Les lignes marquées partiel signifient que seule une petite partie se recoupe.

capacité expo-app-intentsCapgo aujourd'hui
Actions personnalisées dans Siri et l'app Raccourcis via des commandes vocalesOui 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 recherchableOui 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èmePartiel. 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êtOui 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 IntentsPartiel. 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'appOui. 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.

ObjectifCommencer ici
Écran de verrouillage et Dynamic Island avec SVG et logs de tapWidgetKit
JSON de layout riche et séquences de timerActivités en direct
L'utilisateur partage un lien ou un fichier dans votre appCible de partage
Deep link vers les réglages Wi-Fi ou de l'appLancement d'intentions
Phrase Siri qui exécute votre handler JS avec des paramètres d'entitéApp Intents (codegen pour les phrases, setEntityCatalog, useAppIntentsListener)
DomaineStatut
Widget Kit personnalisé AppShortcut phrases liées au log d'événements du templateWidget 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 natifNon disponible pour les applications tierces ; App Intents met à la place un handler JS en file d'attente.
Parité des App Intents sur AndroidApp Intents n'est disponible que sur iOS 16+ ; Android renvoie une erreur explicite.