メインコンテンツへスキップ

Siri、ショートカット、ウィジェット、およびシステムインテント

Expoは最近、 expo-app-intentsをリリースしました。これにより、Appleの App Intents フレームワークがJavaScriptと連携可能になります:Siriやショートカットのフレーズ、実行時のエンティティカタログ、Apple Intelligence用のAppleアプリスキーマ、Spotlightインデックス、そしてJavaScriptの起動前に届いた呼び出しを処理するネイティブキューなどが含まれます。

@capgo/capacitor-app-intents は、Apple向けのCapacitorブリッジです App Intents:Siriやショートカットのフレーズ(コンパイル時のcodegen経由)、実行時のエンティティカタログ、Spotlightインデックス、ホーム画面のクイックアクション、およびコールドスタート用の保留中の呼び出しキューを提供します。Widget Kit、Live Activities、Share Target、Intent Launcherは、引き続き 関連する 機能に対応しています。このページでは、Androidのコードと混在させることなくシステム連携を実現できるよう、それらがどのように組み合わさるかを解説します。 Intent Apple App Intents を使用した API。

システムサーフェスCapgo プラグインプラグインの主な機能
ホーム画面ウィジェット、ロック画面の Live Activities、Dynamic Island (code の SVG またはネイティブウィジェット)@capgo/capacitor-widget-kitテンプレートアクティビティの永続化、宣言的なアクションの実行、ウィジェットや Live Activity のタップログ記録、App Groups を介したフルネイティブウィジェットセッションの同期。
JSON レイアウトツリーによる Live Activities@capgo/capacitor-live-activitiesCapacitor から ActivityKit アクティビティの開始・更新・終了、タイマーシーケンス、App Group 内での画像の共有。
他のアプリからの共有を受け取る@capgo/capacitor-share-targetshareReceived AndroidのIntent、またはiOSのShare ExtensionとApp Groupを介して、タイトル、テキスト、ファイルのイベントを取得します。
Androidの設定やアクティビティを開く、またはiOSの設定URLを開く@capgo/capacitor-intent-launcherstartActivityAsync, openIOSSettings, openApplication. これは 決して Apple App Intentsです。
Siriフレーズ、Shortcuts、Spotlight、クイックアクション、App Intentキュー@capgo/capacitor-app-intentsDispatch bridge、 setEntityCatalog, indexSpotlightEntities, setHomeScreenShortcutItems, getPendingInvocations, useAppIntentsListener. iOS 16以降。
デバイス上でのLLM(対応iPhoneのApple Intelligence)@capgo/capacitor-llmチャットおよびモデルAPI。App Intentやスキーマのブリッジは不要。

機能の同等性を評価する際は、この表を参照してください。行に「partial」と partial(一部) ある場合は、一部の機能のみが重複していることを意味します。

expo-app-intentsの機能現在のCapgo
音声フレーズによるSiriおよびショートカットアプリでのカスタムアクションはい を使用して @capgo/capacitor-app-intents. フレーズは Swiftのコンパイル時リテラル 生成されたSwift内にあり (AppShortcutsProvider)、実行時のJavaScript文字列ではありません。
JSエンティティカタログによってサポートされるショートカットパラメータ (AppEntity, EntityQuery)はい を使用して @capgo/capacitor-app-intents 経由で setEntityCatalog() およびネイティブ EntityQuery 接続。
Appleアプリのスキーマ(例:Apple Intelligence用のメール下書きインテント)一部対応。 App Intentsが公開する performAppleSchemaTemplate として JavaScriptキューのみ (ネイティブのMail API はありません)。メール作成UIまたはディープリンクはアプリ側で実装します。
Spotlightのインデックス作成とアプリ内コンテンツの検索はい を使用して @capgo/capacitor-app-intents 経由で indexSpotlightEntities() (CSSearchableItem、さらに IndexedEntity iOS 18以降)。
システムインテリジェンス向けに画面上のコンテンツをエンティティに関連付ける一部対応。 エンティティカタログはShortcutsのパラメータを支えます。画面上の関連付けの完全なAPIはまだ公開されていません。
JavaScriptの準備が整う前に発火したアクション用のネイティブキューはい App Intents経由の @capgo/capacitor-app-intents (getPendingInvocations, appIntentInvoked)。Share TargetとWidget Kitは引き続き、共有とテンプレートイベントに独自の保持モデルを使用しています。
App Intents経由のインタラクティブなLive Activityまたはウィジェットボタン一部対応。 Widget Kitは以下を提供します CapgoTemplateActionIntent と CompleteSetIntent として LiveActivityIntent 〜のための型定義 テンプレート iOS 17以降における、ホットスポットやワークアウトのアクションです。これらはネイティブの状態とイベントログを更新しますが、JavaScriptから任意のSiriフレーズを公開するものではありません。
アプリのJavaScriptからWidgetKitやActivityKitをはい。 Widget KitおよびLive Activitiesプラグイン(下記参照)。
Android Intent アクション(settings、VIEW、SENDなど)はい Intent LauncherやShare Targetを介した起動と受信に対応しています。

Widget Kit: ウィジェット、Live Activities、テンプレートアクション

「Widget Kit: ウィジェット、Live Activities、テンプレートアクション」というセクション

@capgo/capacitor-widget-kit に最も近いものは システム表示のUI WebViewの外側にあります。Capacitorからロック画面やDynamic Islandを制御したり、SVGテンプレートやネイティブなSwift/Kotlinのcodeからホーム画面ウィジェットを描画したり、タップ後の処理を行うことができます。

テンプレートのLive Activityを開始し、JavaScriptでアクションを処理する

「テンプレートのLive Activityを開始し、JavaScriptでアクションを処理する」というセクション

アプリ起動時にリスナーを登録し、その後、ポーリングまたは呼び出しを行います。 App ウィジェットのタップはWebViewの読み込み中に発生する場合があるため、レジューム後に実行してください:

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();

iOSでは、ウィジェット拡張内のインタラクティブなコントロールから、バンドルされた CapgoTemplateActionIntent (LiveActivityIntent). そのパスは保存されたテンプレートの状態を更新し、JavaScriptが読み取るものと同じイベントログに追記します。これは 決して ショートカットアプリでユーザー向けのショートカットフレーズを追加するのと同じ動作です。

詳細は WidgetKitの始め方 App Groupの設定と完全なネイティブウィジェットセッションについて。

@capgo/capacitor-live-activities に焦点を当てています。 ActivityKit 宣言的なJSONレイアウト(テキスト、画像、タイマー、ゲージ、Dynamic Island領域)を使用します。App Intentsや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' },
});

選択: Live Activities レイアウトDSLや画像ヘルパーが必要な場合。以下を選択してください: Widget Kit の始め方 ホーム画面ウィジェット、SVGフレーム、またはテンプレートのイベントログや LiveActivityIntent ボタンが必要な場合。

Share Target: 受信共有(Shortcutsからの送信は対象外)

「Share Target: 受信共有(Shortcutsからの送信は対象外)」というセクション

@capgo/capacitor-share-target 他のアプリからコンテンツを送信できるようにします。 次のように分類しています iOSでは、App Groupに書き込むShare Extensionを追加します。メインアプリのプラグインがそのペイロードを読み取ってクリアし、 shareReceived.

iOSのコールドスタートは、ネイティブプラグインが以下を呼び出すことで処理されます: notifyListeners(..., retainUntilConsumed: true) したがって、最初のJavaScriptリスナーは引き続きイベントを受信します。

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);
});

これはAndroidの SEND intentフィルタを補完します。これにより、 決して アプリから共有ショートカットやSiriアクションを公開できます。

Intent Launcher: Android intents および iOS Settings (App Intents ではありません)

「Intent Launcher: Android intents および iOS Settings (App Intents ではありません)」というセクション

この名称はAppleの App Intents. @capgo/capacitor-intent-launcher のみを起動します Android アクティビティ( ActivityAction.CREATE_SHORTCUT レガシーなランチャーショートカット用を含む)および起動 iOS設定 URLスキーム。

import { IntentLauncher, ActivityAction, IOSSettings } from '@capgo/capacitor-intent-launcher';
await IntentLauncher.startActivityAsync({
action: ActivityAction.WIFI_SETTINGS,
});
await IntentLauncher.openIOSSettings({ option: IOSSettings.App });

Siri、ショートカットアプリ、および AppIntent タイプでは、次を使用 @capgo/capacitor-app-intents。Intent LauncherはAndroidのアクティビティとiOS設定のURLのみを起動します。

ゴールはじめに
SVGとタップログによるロック画面・Dynamic Island対応Widget Kit の始め方
リッチなJSONレイアウトとタイマーシーケンスLive Activities
ユーザーによるリンクやファイルの共有共有ターゲット
WiFiやアプリ設定へのディープリンクインテントランチャー
エンティティ引数付きのSiriフレーズとJSハンドラApp Intents (フレーズ用のcodegen) setEntityCatalog, useAppIntentsListener)
項目ステータス
WidgetKit のカスタム AppShortcut テンプレートのイベントログに紐づくフレーズWidgetKit は引き続きバンドル LiveActivityIntent ヘルパーのみ。任意の Siri フレーズは App Intents の codegen 側に置くべきです。
Share Target による API のポーリング現時点ではイベントのみ。使用: addListener('shareReceived') 起動の早い段階で。
Apple Mail スキーマのネイティブ intentサードパーティアプリでは利用できません。代わりにApp IntentsがJSハンドラーをキューに追加します。
AndroidでのApp Intents同等機能App IntentsはiOS 16以降のみ対応しています。Androidでは明確なエラーが返されます。