เว็บแอปคืออินเทอร์เฟซผู้ใช้ (UI) สำหรับการดำเนินการที่ใช้ Interactive Canvas คุณสามารถใช้เทคโนโลยีเว็บที่มีอยู่ (เช่น HTML, CSS, JavaScript และ WebAssembly) เพื่อออกแบบและพัฒนาเว็บแอป โดยมากแล้ว การโต้ตอบ Canvas แสดงผลเนื้อหาเว็บได้เหมือนเบราว์เซอร์ แต่มีข้อจำกัดบางอย่าง เพื่อความเป็นส่วนตัวและความปลอดภัยของผู้ใช้ ก่อนจะเริ่มออกแบบ UI ให้พิจารณาหลักการออกแบบที่ระบุไว้ในหลักเกณฑ์ในการออกแบบ เราขอแนะนำให้ใช้โฮสติ้งของ Firebase ในการทำให้เว็บแอปใช้งานได้
HTML และ JavaScript สำหรับเว็บแอปทำงานต่อไปนี้
- เริ่มต้นไลบรารี JavaScript ของ Interactive Canvas
- ลงทะเบียนการเรียกกลับของเหตุการณ์ Canvas แบบอินเทอร์แอกทีฟ
- ระบุตรรกะที่กำหนดเองสำหรับการอัปเดตเว็บแอปตามสถานะ
หน้านี้จะกล่าวถึงวิธีต่างๆ ที่แนะนำในการสร้างเว็บแอป รวมถึงวิธีเปิดใช้ การสื่อสารระหว่างการดำเนินการแบบการสนทนากับเว็บแอป รวมถึงหลักเกณฑ์ทั่วไป และข้อจำกัด
ไลบรารีที่แนะนำ
แม้ว่าคุณจะสามารถใช้วิธีสร้าง UI ของคุณด้วยวิธีการใดก็ได้ แต่ Google ขอแนะนำว่า ไลบรารีต่อไปนี้
- Greensock: สำหรับการสร้างภาพเคลื่อนไหวที่ซับซ้อน
- Pixi.js: สำหรับการวาดกราฟิก 2D บน WebGL
- Three.js: สำหรับการวาดกราฟิก 3D บน WebGL
- ภาพวาด HTML5 Canvas: สำหรับภาพวาดง่ายๆ
สถาปัตยกรรม
Google ขอแนะนำเป็นอย่างยิ่งให้ใช้สถาปัตยกรรมแอปพลิเคชันหน้าเว็บเดียว ช่วงเวลานี้ แนวทางที่ทำให้เกิดประสิทธิภาพสูงสุดและสนับสนุนการสนทนาอย่างต่อเนื่อง ประสบการณ์ของผู้ใช้ Canvas แบบอินเทอร์แอกทีฟสามารถใช้ร่วมกับฟรอนท์เอนด์ เฟรมเวิร์ก เช่น Vue, Angular และ React ซึ่งจะช่วยในการจัดการรัฐ
ไฟล์ HTML
ไฟล์ HTML จะกำหนดรูปลักษณ์ของ UI ไฟล์นี้ยังโหลดแท็ก Interactive Canvas API ซึ่งจะช่วยให้ใช้การสื่อสารระหว่างเว็บแอปของคุณได้ และการดำเนินการแบบการสนทนา
<!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>
สื่อสารระหว่างการดำเนินการแบบการสนทนากับเว็บแอป
หลังจากสร้างเว็บแอปและ "การดำเนินการแบบการสนทนา" และโหลดในฟีเจอร์อินเทอร์แอกทีฟแล้ว ไลบรารี Canvas ในไฟล์เว็บแอป คุณจะต้องกำหนดวิธีที่เว็บแอปและ การโต้ตอบแบบการสนทนา โดยแก้ไขไฟล์ที่มีเว็บแอป
action.js
ไฟล์นี้มีโค้ดที่ใช้กำหนด callback และเรียกใช้
เมธอดจนถึง interactiveCanvas
Callback จะช่วยให้เว็บ
เพื่อตอบสนองต่อข้อมูลหรือคําขอจากการดําเนินการแบบการสนทนา ขณะที่เมธอด
เป็นวิธีส่งข้อมูลหรือคำขอไปยังการดำเนินการแบบการสนทนา
เพิ่ม interactiveCanvas.ready(callbacks);
ลงในไฟล์ HTML เพื่อเริ่มต้นและ
Callback ที่ลงทะเบียน:
/**
* 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
โมดูล JavaScript main.js
จะนำเข้าไฟล์ action.js
และ scene.js
และ
จะสร้างอินสแตนซ์แต่ละรายการเมื่อเว็บแอปโหลดขึ้น และโมดูลนี้ยัง
ลงทะเบียน Callback สำหรับ Interactive Canvas
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
ไฟล์ scene.js
จะสร้างโหมดสำหรับเว็บแอป ต่อไปนี้เป็น
ข้อความที่ตัดตอนมาจาก scene.js
:
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;
});
รองรับการโต้ตอบการสัมผัส
การดำเนินการ Interactive Canvas สามารถตอบสนองต่อการแตะของผู้ใช้ได้เช่นเดียวกับ จากเสียงร้องของเด็กๆ ตามหลักเกณฑ์การออกแบบ Interactive Canvas คุณควรพัฒนาการดำเนินการให้เป็นแบบ "เน้นเสียงเป็นหลัก" อย่างไรก็ตาม บางคนมีความฉลาด แสดงการสนับสนุนการโต้ตอบการสัมผัส
การสนับสนุนการสัมผัสคล้ายกับการสนับสนุนการสนทนา อย่างไรก็ตาม แทนที่จะส่งเสียงตอบกลับจากผู้ใช้ JavaScript ฝั่งไคลเอ็นต์ของคุณจะ สำหรับการโต้ตอบด้วยการสัมผัสและใช้การโต้ตอบดังกล่าวเพื่อเปลี่ยนองค์ประกอบในเว็บแอป
คุณสามารถดูตัวอย่างได้ในตัวอย่าง ซึ่งใช้ฟิลด์ ไลบรารี Pixi.js
…
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;
});
การแก้ปัญหา
ขณะที่คุณใช้เครื่องมือจำลองในคอนโซลการดำเนินการเพื่อทดสอบระบบ Canvas Action ระหว่างการพัฒนา คุณยังสามารถดูข้อผิดพลาดที่เกิดขึ้นภายใน เว็บแอป Canvas แบบอินเทอร์แอกทีฟสำหรับผู้ใช้ อุปกรณ์ที่ใช้งานจริง คุณสามารถดูข้อมูลเหล่านี้ ในบันทึก Google Cloud Platform ของคุณ
วิธีดูข้อความแสดงข้อผิดพลาดเหล่านี้ใน Google Cloud บันทึกแพลตฟอร์ม ให้ทำตามขั้นตอนต่อไปนี้
- เปิดโปรเจ็กต์ Actions ในคอนโซล Actions
- คลิกทดสอบในแถบนำทางด้านบน
- คลิกลิงก์ดูบันทึกใน Google Cloud Platform
ข้อผิดพลาดจากผู้ใช้ของคุณ อุปกรณ์จะปรากฏในโปรแกรมดูบันทึกตามลำดับเวลา
ประเภทของข้อผิดพลาด
ข้อผิดพลาดของเว็บแอปที่คุณเห็นในบันทึกของ Google Cloud Platform มีอยู่ 3 ประเภทดังนี้
- การหมดเวลาที่เกิดขึ้นเมื่อไม่ได้เรียกใช้
ready
ภายใน 10 วินาที - การหมดเวลาที่เกิดขึ้นเมื่อไม่มีการทำตามสัญญาที่
onUpdate()
ส่งกลับมา ภายใน 10 วินาที - ข้อผิดพลาดเกี่ยวกับรันไทม์ของ JavaScript ที่ไม่ได้ตรวจพบภายในเว็บแอป
ดูรายละเอียดข้อผิดพลาด JavaScript
รายละเอียดของข้อผิดพลาดรันไทม์ของ JavaScript ภายในเว็บแอปจะไม่ พร้อมใช้งานโดยค่าเริ่มต้น หากต้องการดูรายละเอียดข้อผิดพลาดรันไทม์ของ JavaScript ให้ทำตาม ขั้นตอนเหล่านี้:
- ตรวจสอบว่าคุณได้กําหนดค่าการแชร์ทรัพยากรแบบข้ามต้นทางที่เหมาะสมแล้ว (CORS) ส่วนหัวการตอบกลับ HTTP ในไฟล์เว็บแอป สำหรับข้อมูลเพิ่มเติม ดูการแชร์ทรัพยากรข้ามต้นทาง
- เพิ่ม
crossorigin="anonymous"
ลงในแท็ก<script>
ที่คุณนำเข้าใน ไฟล์ HTML ดังที่แสดงในข้อมูลโค้ดต่อไปนี้
<script crossorigin="anonymous" src="<SRC>"></script>
หลักเกณฑ์และข้อจำกัด
พิจารณาหลักเกณฑ์และข้อจำกัดต่อไปนี้ขณะที่พัฒนา เว็บแอปของคุณ
- ไม่มีคุกกี้
- ไม่มีพื้นที่เก็บข้อมูลในเครื่อง
- ไม่มีข้อมูลตำแหน่งทางภูมิศาสตร์
- ไม่ได้ใช้กล้อง
- ไม่มีการบันทึกเสียงหรือวิดีโอ
- ไม่มีป๊อปอัป
- ใช้หน่วยความจำไม่เกิน 200 MB
- คำนึงถึงส่วนหัวของชื่อการทำงานเมื่อแสดงผลเนื้อหา (มีโฆษณา ส่วนบนของหน้าจอ)
- ไม่มีรูปแบบที่ใช้กับวิดีโอได้
- ใช้องค์ประกอบสื่อได้ครั้งละ 1 รายการเท่านั้น
- ไม่มีฐานข้อมูล SQL ในเว็บ
- ไม่รองรับอินเทอร์เฟซ
SpeechRecognition
ของ Web Speech API - การตั้งค่าโหมดมืดไม่เกี่ยวข้อง
- จออัจฉริยะรองรับการเล่นวิดีโอ ดูข้อมูลเพิ่มเติมเกี่ยวกับ รูปแบบคอนเทนเนอร์สื่อและตัวแปลงรหัสที่รองรับ โปรดดูตัวแปลงรหัส Google Nest Hub
การแชร์ทรัพยากรข้ามแหล่งที่มา
เนื่องจากเว็บแอป Interactive Canvas โฮสต์อยู่ใน iframe และมีการตั้งค่าต้นทาง เป็นค่าว่าง คุณต้องเปิดใช้การแชร์ทรัพยากรแบบข้ามต้นทาง (CORS) สำหรับเว็บเซิร์ฟเวอร์และทรัพยากรพื้นที่เก็บข้อมูลของคุณ กระบวนการนี้ช่วยให้เนื้อหา ยอมรับคำขอจากต้นทางที่ไม่มีข้อมูล
- หากสื่อและรูปภาพโฮสต์อยู่กับ Firebase โปรดดู สร้างลิงก์แบบไดนามิกของโดเมนที่กำหนดเองเพื่อกำหนดค่า CORS
- หากสื่อและรูปภาพอยู่ใน Cloud Storage โปรดดู การกำหนดค่าการแชร์ทรัพยากรข้ามต้นทาง (CORS) เพื่อกำหนดค่า CORS
ขั้นตอนถัดไป
หากต้องการเพิ่มฟีเจอร์เพิ่มเติมลงในเว็บแอปของคุณ โปรดดูหัวข้อสร้างด้วยไคลเอ็นต์ต่อไปหรือ Fulfillment ฝั่งเซิร์ฟเวอร์