Conversational Actions will be deprecated on June 13, 2023. For more information, see Conversational Actions sunset.

Mengonfigurasi aplikasi web Anda

Stay organized with collections Save and categorize content based on your preferences.

Aplikasi web adalah antarmuka pengguna (UI) untuk Action yang menggunakan Canvas Interaktif. Anda dapat menggunakan teknologi web yang sudah ada (seperti HTML, CSS, JavaScript, dan WebAssembly) untuk mendesain dan mengembangkan aplikasi web Anda. Untuk sebagian besar, Interactive Kanvas dapat merender konten web seperti browser, tetapi ada beberapa batasan yang diterapkan untuk privasi dan keamanan pengguna. Sebelum mulai mendesain UI, perhatikan prinsip desain yang diuraikan dalam Pedoman desain. Sebaiknya gunakan hosting Firebase untuk men-deploy aplikasi web Anda.

HTML dan JavaScript untuk aplikasi web Anda melakukan hal berikut:

Halaman ini membahas cara yang direkomendasikan untuk membuat aplikasi web, cara mengaktifkan komunikasi antara Action Percakapan dan aplikasi web Anda, serta pedoman dan batasan umum.

Meskipun Anda dapat menggunakan metode apa pun untuk mem-build UI, Google merekomendasikan penggunaan library berikut:

Arsitektur

Google sangat merekomendasikan penggunaan arsitektur aplikasi web satu halaman. Pendekatan ini memungkinkan performa yang optimal dan mendukung pengalaman pengguna yang berkelanjutan dalam percakapan. Interactive Canvas dapat digunakan bersama dengan framework front-end seperti Vue, Angular, dan React, yang membantu pengelolaan status.

File HTML

File HTML menentukan tampilan UI Anda. File ini juga memuat Interactive Kanvas API, yang memungkinkan komunikasi antara aplikasi web Anda dan Action Percakapan.

HTML

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>Interactive Canvas Sample</title>

    <!-- Disable favicon requests -->
    <link rel="shortcut icon" type="image/x-icon" href="data:image/x-icon;,">

    <!-- Load Interactive Canvas JavaScript -->
    <script src="https://www.gstatic.com/assistant/interactivecanvas/api/interactive_canvas.min.js"></script>

    <!-- Load PixiJS for graphics rendering -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/pixi.js/4.8.7/pixi.min.js"></script>

    <!-- Load Stats.js for fps monitoring -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/stats.js/r16/Stats.min.js"></script>

    <!-- Load custom CSS -->
    <link rel="stylesheet" href="css/main.css">
  </head>
  <body>
    <div id="view" class="view">
      <div class="debug">
        <div class="stats"></div>
        <div class="logs"></div>
      </div>
    </div>
    <!-- Load custom JavaScript after elements are on page -->
    <script src="js/log.js"></script>
    <script type="module" src="js/main.js"></script>
  </body>
</html>
    

Berkomunikasi antara Action Percakapan dan aplikasi web

Setelah membuat aplikasi web dan Action Percakapan serta dimuat di library Interactive Canvas di file aplikasi web, Anda harus menentukan cara aplikasi web dan Action Percakapan berinteraksi. Untuk melakukannya, ubah file yang berisi logika aplikasi web Anda.

action.js

File ini berisi kode untuk menentukan callback dan memanggil metode melalui interactiveCanvas. Callback memungkinkan aplikasi web Anda merespons informasi atau permintaan dari Action Percakapan, sementara metode menyediakan cara untuk mengirim informasi atau permintaan ke Action Percakapan.

Tambahkan interactiveCanvas.ready(callbacks); ke file HTML Anda untuk menginisialisasi dan mendaftarkan callback:

JavaScript

/**
* This class is used as a wrapper for Google Assistant Canvas Action class
* along with its callbacks.
*/
export class Action {
 /**
  * @param  {Phaser.Scene} scene which serves as a container of all visual
  * and audio elements.
  */
 constructor(scene) {
   this.canvas = window.interactiveCanvas;
   this.gameScene = scene;
   const that = this;
   this.intents = {
     GUESS: function(params) {
       that.gameScene.guess(params);
     },
     DEFAULT: function() {
       // do nothing, when no command is found
     },
   };
 }

 /**
  * Register all callbacks used by the Interactive Canvas Action
  * executed during game creation time.
  */
 setCallbacks() {
   const that = this;
   // Declare the Interactive Canvas action callbacks.
   const callbacks = {
     onUpdate(data) {
       const intent = data[0].google.intent;
       that.intents[intent ? intent.name.toUpperCase() : 'DEFAULT'](intent.params);
     },
   };
   // Called by the Interactive Canvas web app once web app has loaded to
   // register callbacks.
   this.canvas.ready(callbacks);
 }
}
    

main.js

Modul JavaScript main.js mengimpor file action.js dan scene.js serta membuat instance dari setiap file saat aplikasi web dimuat. Modul ini juga mendaftarkan callback untuk Interactive Canvas.

JavaScript

import {Action} from './action.js';
import {Scene} from './scene.js';
window.addEventListener('load', () => {
  window.scene = new Scene();
  // Set Google Assistant Canvas Action at scene level
  window.scene.action = new Action(scene);
  // Call setCallbacks to register Interactive Canvas
  window.scene.action.setCallbacks();
});
    

scene.js

File scene.js membuat scene untuk aplikasi web Anda. Berikut adalah kutipan dari scene.js:

JavaScript

const view = document.getElementById('view');

// initialize rendering and set correct sizing
this.radio = window.devicePixelRatio;
this.renderer = PIXI.autoDetectRenderer({
  transparent: true,
  antialias: true,
  resolution: this.radio,
  width: view.clientWidth,
  height: view.clientHeight,
});
this.element = this.renderer.view;
this.element.style.width = `${this.renderer.width / this.radio}px`;
this.element.style.height = `${(this.renderer.height / this.radio)}px`;
view.appendChild(this.element);

// center stage and normalize scaling for all resolutions
this.stage = new PIXI.Container();
this.stage.position.set(view.clientWidth / 2, view.clientHeight / 2);
this.stage.scale.set(Math.max(this.renderer.width,
    this.renderer.height) / 1024);

// load a sprite from a svg file
this.sprite = PIXI.Sprite.from('triangle.svg');
this.sprite.anchor.set(0.5);
this.sprite.tint = 0x00FF00; // green
this.sprite.spin = true;
this.stage.addChild(this.sprite);

// toggle spin on touch events of the triangle
this.sprite.interactive = true;
this.sprite.buttonMode = true;
this.sprite.on('pointerdown', () => {
  this.sprite.spin = !this.sprite.spin;
});
    

Mendukung interaksi sentuh

Interactive Canvas Action dapat merespons sentuhan pengguna serta input suara mereka. Sesuai dengan pedoman desain Kanvas Interaktif, Anda harus mengembangkan Action untuk "mengutamakan suara". Karena itu, beberapa layar smart mendukung interaksi sentuh.

Mendukung sentuhan mirip dengan mendukung respons percakapan; tetapi, bukan respons suara dari pengguna, JavaScript sisi klien Anda mencari interaksi sentuh dan menggunakannya untuk mengubah elemen di aplikasi web.

Anda dapat melihat contohnya dalam contoh ini, yang menggunakan library Pixi.js:

JavaScript

…
this.sprite = PIXI.Sprite.from('triangle.svg');
…
this.sprite.interactive = true; // Enables interaction events
this.sprite.buttonMode = true; // Changes `cursor` property to `pointer` for PointerEvent
this.sprite.on('pointerdown', () => {
  this.sprite.spin = !this.sprite.spin;
});
    

Pemecahan masalah

Meskipun dapat menggunakan simulator di konsol Actions untuk menguji Action Canvas Interaktif selama pengembangan, Anda juga dapat melihat error yang terjadi dalam aplikasi web Canvas Interaktif Anda di perangkat pengguna dalam produksi. Anda dapat melihat error ini dalam log Google Cloud Platform.

Untuk melihat pesan error ini di log Google Cloud Platform Anda, ikuti langkah-langkah berikut:

  1. Buka project Actions di konsol Actions.
  2. Klik Uji di navigasi atas.
  3. Klik link View logs in Google Cloud Platform.

Error dari perangkat pengguna Anda muncul dalam urutan kronologis di penampil log.

Jenis error

Ada tiga jenis error aplikasi web yang dapat Anda lihat di log Google Cloud Platform:

  • Waktu tunggu yang habis saat ready tidak dipanggil dalam 10 detik
  • Waktu tunggu yang terjadi saat promise yang ditampilkan oleh onUpdate() tidak terpenuhi dalam 10 detik
  • Error runtime JavaScript yang tidak tertangkap dalam aplikasi web Anda

Melihat detail error JavaScript

Detail error runtime JavaScript dalam aplikasi web Anda tidak tersedia secara default. Untuk melihat detail error runtime JavaScript, ikuti langkah-langkah berikut:

  1. Pastikan bahwa Anda telah mengonfigurasi header respons HTTP berbagi resource lintas asal (CORS) yang sesuai di file aplikasi web. Untuk informasi selengkapnya, lihat Berbagi resource lintas asal.
  2. Tambahkan crossorigin="anonymous" ke tag <script> yang diimpor di file HTML Anda, seperti yang ditunjukkan dalam cuplikan kode berikut:
<script crossorigin="anonymous" src="<SRC>"></script>

Panduan dan batasan

Pertimbangkan panduan dan batasan berikut saat Anda mengembangkan aplikasi web:

  • Tidak ada cookie
  • Tidak ada penyimpanan lokal
  • Tidak ada geolokasi
  • Tidak ada penggunaan kamera
  • Tidak ada rekaman audio atau video
  • Tidak ada pop-up
  • Pertahankan di bawah batas memori 200 MB
  • Mempertimbangkan header Nama tindakan saat merender konten (menempati bagian atas layar)
  • Tidak ada gaya yang dapat diterapkan ke video
  • Hanya satu elemen media yang dapat digunakan dalam satu waktu
  • Tidak ada database SQL Web
  • Tidak ada dukungan untuk antarmuka SpeechRecognition Web Speech API.
  • Setelan mode gelap tidak berlaku
  • Pemutaran video didukung di layar smart. Untuk informasi selengkapnya tentang format dan codec penampung media yang didukung, lihat codec Google Nest Hub.

Cross-origin resource sharing

Karena aplikasi web Canvas Interaktif dihosting di iframe dan asalnya ditetapkan ke null, Anda harus mengaktifkan berbagi resource lintas asal (CORS) untuk server web dan resource penyimpanan. Proses ini memungkinkan aset Anda menerima permintaan dari asal null.

Langkah berikutnya

Untuk menambahkan fitur lainnya ke aplikasi web Anda, lihat Melanjutkan pembuatan dengan fulfillment sisi klien atau server.