ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
Siri Event Suggestionsを使ってリーチを広げる
Appやウェブ、またはEメールでイベント情報をホストする場合、Siri Event Suggestionsは予定を把握する助けになります。このことによってプライバシーを危険にさらす必要もありません。イベント情報をカレンダーAppに自動的に表示し、複雑な情報提供を管理したり、イベントを様々な条件タイプと関連付ける方法や、ウェブやEメール用のiOSやMarkup向けにSiri Event Suggestions APIを使う方法についてもお伝えします。
リソース
- Integrating Your App with Siri Event Suggestions
- Register with Apple for Siri Event Suggestions Markup
関連ビデオ
WWDC23
WWDC20
- インテリジェンスのためのデザイン - 人々のいる場所で会うこと
- インテリジェンスのためのデザイン - 「システム」と友達になる
- インテリジェンスのためのデザイン-新しい機会を発見する
- インテリジェンスのためのデザイン-進化したApp
- SiriKitとショートカットの新機能
WWDC19
-
ダウンロード
こんにちは WWDCへようこそ “Siri Event Suggestionsを使って 活動範囲を広げる” Proactive Intelligence部門所属の ソフィアンです 今日は同僚のロマンと マグヌスと一緒に 予約情報をシステムに統合する方法と それに伴う大きな利点を お伝えしたいと思います 昨年 iOS 13で Siri Event Suggestions APIを導入しました この1年間で 非常に多くの アプリケーションで採用されています 我々は 皆さんからの フィードバックをもとに 改良を重ねました “Siri Event Suggestions”という機能は アプリケーションを使って行った予約を カレンダーに追加してくれるものです
皆さんは通常 アプリケーションを使って予約しますね するとカレンダーに予約が登録され システムが 予約に関連した情報を 効率的に提供してくれます 例えば レストランを予約した場合 交通状況を考慮したうえで 家を出る時間になると ロック画面に通知が出ます またマップでは 空港への経路の提案を行い タップ一つで フライト時刻に間に合います さらにサイレントモードへの 切り替えを提案し 映画などを静かに楽しめるようにします またフライトのチェックイン時刻も ロック画面で教えてくれます 我々はデベロッパおよびユーザーの 快適な生活を考慮し いくつかの機能を強化・改善しました
4つのカテゴリに分けて説明します まずは予約機能のアップデートと プラットフォームの拡張について 次に webマークアップを使用し “Siri Event Suggestions”をウェブ サイトなどと統合する方法を説明します
そして 昨年の フィードバックをもとに 予約情報をSiriに提供する ベストプラクティスについてお話しします 最後に デバッグを容易にする ヒントやコツをお教えしましょう 盛りだくさんの内容です 早速 始めましょう レストランに 飛行機 イベントまで すでに多くの予約カテゴリが 網羅されています 今年はさらに バスとボートの予約を追加しました ただし1日フリーパスではなく 特定の時間に運行する バスチケットの予約のみが対象となります 予約カテゴリの追加に加え プラットフォームも新規拡大しました “Siri Event Suggestions”が macOS Big Surにも導入されたのです Mac Catalystで構築した アプリケーションなどで行った予約は Intents.frameworkを使って提供します 方法はiOSと同様 予約をシステムに提供するだけです すると このように オンデバイスで情報を得られます カレンダーに登録された予約や 提案なども同様です
iOSとmacOSの両方を使用している場合は すべてのプラットフォームに 提供が必要です 提供したデータに一貫性があれば システムは暗号化したうえで 予約をすべてのデバイス間で 自動的に同期することができます また シミュレータの使用を可能にし 開発をより簡単にしました シミュレータをターゲットとして 選択するだけです Siri Event Suggestions APIは Intents.frameworkの一部として iOSのアプリケーションとMacでも利用可能です 昨年のセッションでも詳しく紹介していますので このAPIを使う際にはぜひご確認ください
予約方法や予約情報への アクセスの仕方にかかわらず 誰もが同様にオンデバイスで 情報を得られることが重要です 皆さんの顧客は さまざまな媒体を利用します 例えばウェブサイトで行った予約を アプリケーションを使って変更し メールで確認するなどです そこで皆さんに メールとSafariとも 統合できる方法をお教えします メールかウェブサイトのHTMLに webマークアップを埋め込む それだけです
ここからはロマンにバトンタッチします “Siri Event Suggestions”をマークアップで ウェブサイトやメールと 統合する方法をお伝えします ロマン? はじめまして ロマンです ウェブサイトやメールにマークアップを 追加する方法を説明します これはiOS 14とmacOS Big Surの新機能です
Safariで予約を表示すると 追加されたマークアップを探し カレンダーに自動で予約を追加します メールからの予約情報も カレンダーに追加されるため アプリケーションの起動も不要です
さらに 重要な情報が一目で分かるよう 画面上部にバナーが表示されます 我々はschema.orgを使用しています 標準的なマークアップ規格であり 予約情報をメールやウェブサイトに 簡単にアノテートできます あらゆるメールソフトやブラウザ プラットフォームで通用する規格です 我々はJSON-LDとMicrodataの 両方をサポートしています 特定のカテゴリや プロパティに関する資料については developer.apple.com.をご覧ください メールやウェブサイトに マークアップを追加しましょう これはレストランの予約確認メールの例です このメールには情報が満載です
例えばレストランの名前 予約の日時 またレストランの電話番号と住所も
これがJSON-LDによる 完成マークアップです マークアップの情報が多いほど ユーザー体験は快適になります 例えば 予約先の住所が分かれば 出発時間の通知も可能になるのです
これはMicrodataを使った同じマークアップです 予約の変更やキャンセルをする際は マークアップのアップデートが重要です マークアップには最新の予約情報が 記述されなければなりません 同じ予約IDを使えば Siriが自動的に カレンダーイベントを変更します
例えば ユーザーが予約時間を 午後7時30分から6時30分に変更した場合 同じ予約IDを使えば startDateプロパティに反映されます
予約をキャンセルするにはreservationStatusを ReservationCancelledにすると Siriがカレンダーイベントを 自動的にキャンセルします これがマークアップ追加に 必要なツールのすべてです 次に必要条件について話します
1つ目はAppleへのドメイン登録です developer.apple.comに シンプルなフォームがあります そこからドメインと マークアップのサンプルを送ります
またウェブサイトにはHTTPS メールには有効なDKIM署名が必要です これでSafariとメールが 予約情報をシステムに提供できます また この必要条件を無効にし 動作確認のテストを簡単に行うため 2つの設定を追加しました
まず iOSではデベロッパ設定において “Allow Any Domain”を有効にします Macでは下のコマンドを使います
ローカル開発を行う場合は iOSの設定で “Allow Unverified Sources”を有効に Macでは別のコマンドを使います どう動作するか お見せしますね schema.orgマークアップをテストするには いくつか準備が必要です まずSuggestionsAllowAnyDomainForMarkupを 初期化して未登録のドメインを許可します
完了です 次にローカル開発環境では HTTPSを使用していないので SuggestionsAllowUnverifiedSourceForMarkup を設定します 未登録のソースによる確認作業を可能にします
終わりです
レストラン予約サイトを使って試してみます schema.orgでのマークアップは済んでいます 店を探しましょう この店にします
今週の金曜 午後7時30分に 人数は2名で予約をします
ウェブサイトで 情報が正しいか確認できます まだ予約は確定していないので カレンダーには追加されません 問題ないようなので予約を確定します
マークアップに確定した予約情報が入ると Safariがシステムに予約情報を提供し 僕はカレンダーの通知を受けます
Siriが作ったカレンダーイベントを見ます
“通知”をクリックすると 必要な情報がすべて見られます カレンダーに追加しましょう
マークアップにURLがあれば カレンダーにリンクが貼り付けられ ウェブサイトにアクセスできて 簡単に予約管理ができます クリックすると予約ページに飛びます
SafariのWebインスペクタを使って マークアップを見てみます
JSON-LDタグには 予約に関する情報のすべてが含まれており
予約が確定したことが分かります 予約IDです 先ほど見た リンクとして使われる URLもあります
予約開始時間は ISO 8601形式で表記されており 予約した場所のタイムゾーンも分かります
それでは 気が変わって 予約をキャンセルするとします
重要なのは マークアップが変更を反映することです reservationStatusが ReservationCancelledになりました するとカレンダーイベントも 自動的にキャンセルされます メールでも機能します schema.orgのマークアップを使い 仮想サイトから自動的に確認メールを送ります iOSで見てみましょう
予約キャンセルの確認メールが届きました メールを開きます 上部のバナーから Siriがキャンセルを 検知していることが分かり タップでカレンダーイベントを削除できます 消えました 重要なのは 確認や変更には 同じ予約IDを使うことです macOSとiOSのマークアップを使えば “Siri Event Suggestions”の統合は容易です “Siri Event Suggestions”の仕組みの 要点をまとめましょう デベロッパ向けのドキュメントで規定された 形式やプロパティに合わせる必要があります 例を挙げます まず 適切なreservationStatusを 使いましょう 例えば ReservationConfirmedは 予約が確定した時だけ使います これは支払いの完了を 意味することもあります
予約日時には注意したほうがいいでしょう 予約場所のタイムゾーンも含め ISO 8601形式を使うことが重要です
またマークアップには 常に同じ予約IDを使うこと こうすることでSiriがカレンダーイベントを アップデートできるのです “Siri Event Suggestions”の統合に関する 次のステップへ進みましょう “次のステップ” まず予約状況を含む詳細を 正確に反映するマークアップの追加です
次にデベロッパ設定から ローカル環境で動作を確認します
そして動作確認が完了したら ドメインを登録します これで予約システムが 快適に使えるようになります 次は 同僚のマグナスが 提供のベストプラクティスについて説明します ありがとう 昨年のリリース以降 APIが広く活用されています またユーザーからはAPI活用の問題点など 今後に役立つフィードバックもいただきました ここではユーザーが満足できる ベストプラクティスをお話しします まずAPIの機能をおさらいしましょう “Siri Event Suggestions”の統合に 必要なのは予約の詳細情報です この仮想の予約アプリケーションを使い 提供の流れを説明します
Siriに提供するには予約情報を itemReservationオブジェクトに関連付けます 緑の枠の中にアプリケーション内の 予約情報が入っています itemReferenceを例として表示します
itemReservationが intentのレスポンスに追加され Siriに提供する情報が形成されます
提供を受けたSiriはユーザーに対して カレンダーに予約が追加されたことを通知します
これでユーザーは カレンダーから情報にアクセスできます
詳細の確認や 予約管理のため 簡単にアプリケーションに戻れるよう カレンダーに “Show in App”を配置しました
“Show in App”ボタンを押すと INGetReservationDetailsIntentを構築 ユーザーが表示したい予約情報を集約します
イベントの作成に使用した情報を参照するのです
アクティビティとintentとの相互作用で アプリケーションが起動されます アプリケーションはこの情報をもとに 適切な予約を表示します
コンテナとアイテムの参照が アプリケーションの起動に使用されます INReservationプロパティに似た 予約番号との違いを見てみましょう 複数ソースの予約変更を識別するため Siriは予約番号を使用します Siri Event Suggestions APIを アプリケーションでサポートし かつウェブサイトやメールを サポートしている場合 すべて同じ予約番号を使用してください
同様に 予約を更新したりキャンセルする際にも Siriは予約番号でイベントを識別します
コンテナとアイテムのリファレンスは アプリケーションの起動に使用されます コンテナリファレンスは アプリケーション内の予約を一意に識別しますが 予約は複数パーツを持つ可能性があります 例えば 複数経路のフライト予約において 各経路は予約の一部であり 一意のアイテムリファレンスを持つ 個々のINReservationオブジェクトになります
アイテムリファレンスが一意であるべき理由は フライト2便のうち1便など 予約の一部を表示するためです
コンテナとアイテムリファレンスの仕組みを 理解いただけたので 実際に予約を行いながら 適切な値を選択してみましょう これは前述のアプリケーションです 画面のように レストラン予約ができます
予約番号は 予約全体として識別されますが 本件は単一の予約なので containerReferenceとして使用しましょう “単一の予約” 予約が単一の場合 itemReferenceを containerReferenceとして使用できます
参考のため 分かりやすい spokenPhraseも設定します “ACME Eatery”にしましょう 予約のショートカット作成など リファレンスが必要な場合に使用します 再度 両方のリファレンスに 同じ値を使用しました “周遊旅行” 次は 往復列車の予約のように 乗換予約を行うアプリケーションです
この予約は2つの旅程を含んでいます
前述したとおり 予約番号は 全旅程のものとして識別されるため containerReferenceとして使用します 予約を説明するspokenPhraseも 忘れずに設定しましょう
2つの旅程について 各TrainReservationオブジェクトを作成します 2つの旅程については予約番号が1つのため 先ほどのようにitemReferenceとして 使用できません 代わりに それぞれ固有の識別子を選択します 今回は それぞれのチケット番号を 使用しましょう このようにして 片方の旅程だけを簡単に表示できます それぞれにspokenPhraseも設定しました 複数の異なるカテゴリで 予約可能なアプリケーションもあります 移動手段や宿泊が一緒に予約できる 旅行代理店と同じです それでは フライト2便と ホテル1泊の3つを予約しましょう “複数予約” 今回の予約には予約番号も3つあります フライト2便分と宿泊分 そして旅行全体の計3つです containerReferenceは 予約全体を識別する必要があるため 旅行全体の予約番号を使いましょう
1便ごとにフライト予約も作成しますが
各フライトは 同じ番号を共有しているため itemReferenceに使用できません そこで 予約番号とフライト番号を組み合わせ 新しい識別子を作成し itemReferenceに使用します 起動時に予約を見つけられるもので 一意であれば どんな識別子でも使えます
宿泊の予約では LodgingReservationオブジェクトを作成します ホテルの予約番号は宿泊にのみ使用されており 一意なのでitemReferenceに使用できます
コンテナとアイテムリファレンスの 設定方法をいくつか提示し アプリケーションが提供する 予約の利便性をご覧いただきました アプリケーションが入っていないデバイスに カレンダーイベントを表示してみましょう
今年 INReservationクラスに 新しいURLプロパティを追加しました アプリケーションが インストールされていないデバイスで カレンダーイベントの予約URLを表示する場合 カレンダーに “Show in Safari”ボタンが 表示されます アプリケーションがなくても ボタンを押せばURLが開きます Safari上で予約の詳細を確認できるのです “新URLプロパティ” 新URLプロパティを使えば アプリケーションなしのデバイスでも カレンダーの予定を同期でき 優れたユーザー体験を提供できます そのためには 適切な情報を アプリケーションに提供する必要があります そうすれば 必要な情報が通知と共に送られ システムが最新の予約情報を 確実に受け取ります
今年 通知方法に変更を加え 予約を含む複数の提供ができるようになりました システムで複数の提供が行われた時も 短時間で通知をグループ化します この実施に理想的なのは 予約リストのアプリケーション表示時です “4イベント該当” 単一の予約を表示する場合や 映画券2枚の片方など 予約の特定の部分の表示に適しています システムは 初めて提供された 予約通知のみ表示します
アプリケーション外での予約変更にも 見事に対応します “変化への対応” ユーザーのデータを アプリケーションとシステム両方において Siriに提供することで 最新の状態で保存されます そのためには補完的な方法が2つあり すばらしいAPIも用意しています
Background App Refresh APIの使用で 定期的に更新を確認し バックグラウンドでSiriに提供します
変更発生の際に反応できるよう サウンドプッシュ通知を採用してください プッシュ通知を受信すると アプリケーションは予約を更新 Siriに提供します
APIやバックグラウンド処理に関する 情報については 昨年のセッションをご参照ください 以上が提供のベストプラクティスです 次に 予約をSiriに提供する際の 問題のデバッグ方法をお話します 予約情報提供の際 システムの各部分で 非同期に処理される可能性があり 問題が発生した際に アプリケーションへ通知されない場合があります 開発中のデバッグに対応するため 頻出する問題のログを追加しました Mac OSのコンソールにあります
提供関連のログのみを表示するには 検索フィルタを siri-event-suggestionsに設定します この機能について簡単なデモを行います
これはサンプルのアプリケーションです 今年追加されたバス予約機能を試すため createBusReservationメソッドを加えました
これまで バス旅行を2件予約するための ヘルパーメソッドを作りました
ここに予約オブジェクトを作成します
最後に それを アプリケーションの予約リストに追加
実行し 実際の動作を見ましょう iOS 14の新機能として iOSシミュレータ内にSiri Event Suggestions API用のサポートを追加したので 使ってみましょう
シミュレータの実行は ターゲット横のデバイスリストから iOSシミュレータを選択し
“実行”を押します
バスの予約が表示されました 成功です “予約”を押すと詳細が表示されます 予約はSiriに提供されるので イベント作成の通知が来るはずです
通知が来ないので 不具合の可能性がありますが 原因は不明です iOS 14とmacOS Big Sur以降 提供のデバッグ用のログも加えました 確認のため コンソールを開きます
コンソールでは ログ表示のデバイスと ログのフィルタリング方法を選択できます シミュレータからのログを見たいので リストから選択します
このシステムではログが多いため Siriイベント用にログのカテゴリを作成し フィルタとして設定すると 提供関連のメッセージのみ表示されます 使用するためには 検索バーに移動して “siri-event-suggestions”と入力します
検索のタイプも“すべて”から “カテゴリ”に変更します
最後に“Start streaming”を押します
アプリケーションで もう一度試しましょう
コンソールにログメッセージがあります
クリックすると詳細が確認できます 2つ以上の予約が 同じitemReferenceを使用していますね
前述したように 予約はすべて 一意のitemReferenceが必要です これで アプリケーション起動時に 正しい情報を表示できるはずです
コード作成時に 2番目の予約部分をコピペし itemReferenceを変更し忘れたようです 両方とも ABC-001ですね 修正するには2番目のitemReferenceを ABC-002に変更します 本番環境では データベース またはサーバから値を取得しましょう このサンプルでは 単純にハードコードされた値を使用しています アプリケーションを再度実行します
通知はありませんが コンソールに新しいログエントリがあります
詳細を見ましょう
カレンダーの新情報が 確認されていないからですね ユーザーが確認するまで Siriはイベントを追加しません また このシミュレータでは カレンダーが未使用です では カレンダーを開き実行しましょう
これで できるはずです アプリケーションに戻り 再度トライです
できました Siriがカレンダーに予約を追加したと 通知が表示されました 通知を押すと 両方の予約が カレンダーの受信トレイにありました コンソールアプリケーションでのデバッグは Siri Event Suggestions API以外にも役立ちます また ロマンが話した 新しいマークアップのサポートにも使えます 簡単な例を挙げます Safariを開きます
セッション前半で使った予約サイトですね このレストランで2人分の予約をして確認します このページには 予約確認の マークアップが含まれるため Siriは予約をカレンダーに追加したと 通知するはずです しかし また通知が来ません 理由も不明です デバッグのため コンソールを再度表示しましょう 今回はデバイスをMacに設定します
デバイスの変更時は 検索のフィルタを再設定します
スタートを押し
ページに戻りリロード Siriはマークアップを再度読み取ります
その後コンソールに切り替え原因を探します
最新のログエントリを開きます 予約の終了時刻が過ぎていますね 予約時間が過ぎている場合は イベントは追加されません ウェブサイトに戻ると 確かに昨日の予約をしたようです “明日”に更新します
そして確定します
できました Siriからの予約通知が表示されました これがSiriイベントをデバッグする 最も一般的な方法で アプリケーションでのAPI またメールや ウェブサイトのマークアップにも使えます ではソフィアンに総括をお願いします ありがとう マグナス どうも 本日のアップデートの話を ここでまとめます まず バスとボートの予約に対する サポートの追加 macOSでの予約における 優れたクロスプラットフォーム体験の提供 ウェブサイトやメールに マークアップを追加する新方式の導入 これにより 予約へのアクセス方法に関係なく 同一のユーザー体験が可能になります そして最後に デベロッパとしてのエクスペリエンス強化 これは コンソール使用のデバッグや シミュレータ使用の導入テスト簡易化で実現 相互作用を最適に提供する方法や アプリケーションなしでURLプロパティを 利用できる方法についてお話ししました これらの改善がどう活用されるか 楽しみです ありがとうございました
-
-
6:31 - JSON-LD
<script type="application/ld+json"> { "@context": "http://schema.org", "@type": "FoodEstablishmentReservation", "reservationStatus": "http://schema.org/ReservationConfirmed", "reservationId": "IWDSCA", "partySize": "2", "reservationFor": { "@type": "FoodEstablishment", "name": "EPIC Steak", "startDate": "2020-06-26T19:30:00-07:00", "telephone": "(415)369-9955" "address": { "@type": "http://schema.org/PostalAddress", "streetAddress": "369 The Embarcadero", "addressLocality": "San Francisco" "addressRegion": "CA", "postalCode": "95105", "addressCountry": "USA" } } } </script>
-
6:45 - Microdata
<div itemscope itemtype="FoodEstablishmentReservation"> <link itemprop="reservationStatus" href="http://schema.org/ReservationConfirmed"/> <meta itemprop="reservationId" content="IWDSCA"/> <meta itemprop="partySize" content="2"/> <div itemprop="reservationFor" itemscope itemtype="FoodEstablishment"> <meta itemprop="name" content="EPIC Steak"/> <meta itemprop="startDate" content="2020-06-26T19:30:00-07:00"/> <meta itemprop="telephone" content="(415)369-9955"/> <div itemprop="address" itemscope itemtype="PostalAddress"> <meta itemprop="streetAddress" content="369 The Embarcadero"/> <meta itemprop="addressLocality" content="San Francisco"/> <meta itemprop="addressRegion" content="CA"/> <meta itemprop="postalCode" content="95105"/> <meta itemprop="addressCountry" content="USA"/> </div> </div> </div>
-
6:58 - Modified Reservation JSON-LD
<script type="application/ld+json"> { "@context": "http://schema.org", "@type": "FoodEstablishmentReservation", "reservationStatus": "http://schema.org/ReservationConfirmed", "reservationId": "IWDSCA", "partySize": "2", "reservationFor": { "@type": "FoodEstablishment", "name": "EPIC Steak", "startDate": "2020-06-26T18:30:00-07:00", "telephone": "(415)369-9955" "address": { "@type": "http://schema.org/PostalAddress", "streetAddress": "369 The Embarcadero", "addressLocality": "San Francisco" "addressRegion": "CA", "postalCode": "95105", "addressCountry": "USA" } } } </script>
-
7:21 - Cancelled Reservation JSON-LD
<script type="application/ld+json"> { "@context": "http://schema.org", "@type": "FoodEstablishmentReservation", "reservationStatus": "http://schema.org/ReservationCancelled", "reservationId": "IWDSCA", "partySize": "2", "reservationFor": { "@type": "FoodEstablishment", "name": "EPIC Steak", "startDate": "2020-06-26T19:30:00-07:00", "telephone": "(415)369-9955" "address": { "@type": "http://schema.org/PostalAddress", "streetAddress": "369 The Embarcadero", "addressLocality": "San Francisco" "addressRegion": "CA", "postalCode": "95105", "addressCountry": "USA" } } } </script>
-
8:13 - SuggestionsAllowAnyDomainForMarkup default
defaults write com.apple.suggestions SuggestionsAllowAnyDomainForMarkup -bool true
-
8:25 - SuggestionsAllowUnverifiedSourceForMarkup default
defaults write com.apple.suggestions SuggestionsAllowUnverifiedSourceForMarkup -bool true
-
8:49 - SuggestionsAllowAnyDomainForMarkup default
defaults write com.apple.suggestions SuggestionsAllowAnyDomainForMarkup -bool true
-
9:03 - SuggestionsAllowUnverifiedSourceForMarkup default
defaults write com.apple.suggestions SuggestionsAllowUnverifiedSourceForMarkup -bool true
-
10:32 - Reservation Confirmation JSON-LD
<script type='application/ld+json'> { "@context": "http://schema.org", "@type": "http://schema.org/FoodEstablishmentReservation", "reservationId": "IWDSCA", "reservationStatus": "http://schema.org/ReservationConfirmed", "url": "http://localhost:3000/reservations/6", "underName": { "@type": "http://schema.org/Person", "name": "John Appleseed" }, "broker": { "@type": "http://schema.org/Organization", "name": "Apple Reservations" }, "startTime": "2020-06-26T19:30:00-07:00", "partySize": "2", "reservationFor": { "@type": "http://schema.org/FoodEstablishment", "name": "EPIC Steak", "telephone": "(415)369-9955", "address": { "@type": "http://schema.org/PostalAddress", "streetAddress": "369 The Embarcadero", "addressLocality": "San Francisco" "addressRegion": "CA", "postalCode": "95105", "addressCountry": "USA" } } } </script>
-
11:04 - Reservation Cancelled JSON-LD
<script type='application/ld+json'> { "@context": "http://schema.org", "@type": "http://schema.org/FoodEstablishmentReservation", "reservationId": "IWDSCA", "reservationStatus": "http://schema.org/ReservationCancelled", "url": "http://localhost:3000/reservations/6", "underName": { "@type": "http://schema.org/Person", "name": "John Appleseed" }, "broker": { "@type": "http://schema.org/Organization", "name": "Apple Reservations" }, "startTime": "2020-06-26T19:30:00-07:00", "partySize": "2", "reservationFor": { "@type": "http://schema.org/FoodEstablishment", "name": "EPIC Steak", "telephone": "(415)369-9955", "address": { "@type": "http://schema.org/PostalAddress", "streetAddress": "369 The Embarcadero", "addressLocality": "San Francisco" "addressRegion": "CA", "postalCode": "95105", "addressCountry": "USA" } } } </script>
-
13:10 - Registration URL
developer.apple.com/contact/request/siri-events
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。