as

Settings
Sign out
Notifications
Alexa
亚马逊应用商店
AWS
文档
Support
Contact Us
My Cases
新手入门
设计和开发
应用发布
参考
支持

@amazon-devices/kepler-amazon-device-messaging

@amazon-devices/kepler-amazon-device-messaging

该库在适用于Kepler的React Native应用中启用亚马逊设备消息传递服务功能。亚马逊设备消息传递 (ADM) 可让您:

  • 向运行您的应用的亚马逊设备发送消息
  • 将消息从您的云服务传送到安装在亚马逊设备上的应用

开始使用

设置

  1. 将以下库依赖项添加到package.json文件的dependencies部分。

    已复制到剪贴板。

       "@amazon-devices/kepler-amazon-device-messaging": "~1.0.0",
       "@amazon-devices/headless-task-manager": "~0.1.0",
    
  2. 要访问ADM,请在您的manifest.toml中添加以下权限和服务。

    已复制到剪贴板。

     [needs]
    
     [[needs.privilege]]
     id = "com.amazon.device-messaging.privilege.access"
    
     [wants]
    
     [[wants.module]]
     id = "/com.amazon.ace.messaging.service@IDeviceMessaging"
    
     [[wants.service]]
     id = "com.amazon.ace.messaging.service"
    

用法

要使用亚马逊设备消息传递服务,您必须:

  • 在manifest.toml文件中声明您的组件和进程。
  • 在您的App.ts文件中向该服务注册您的应用。
  • 添加代码来处理任务执行。
  • 添加用于注册和处理ADM消息的代码。
  1. 在您的manifest.toml中,声明一项后台运行的任务来接收ADM消息,并使用<程序包ID>. amazon-device-messaging-receiver作为组件ID。

    重要须知:<程序包ID>替换为您的特定程序包ID。

    已复制到剪贴板。

     [components]
    
     [[components.task]]
       id = "<程序包ID>.amazon-device-messaging-receiver"
       runtime-module = "/com.amazon.kepler.keplerscript.runtime.loader_2@IKeplerScript_2_0"
    
     [processes]
    
     [[processes.group]]
     component-ids = ["<程序包ID>.amazon-device-messaging-receiver"]
    
  2. 在您的App.ts中,使用设备消息传递服务注册您的应用并获得注册ID。

    已复制到剪贴板。

     import {
       AmazonDeviceMessagingMessage,
       AmazonDeviceMessagingServer,
       AmazonDeviceMessagingHandler,
     } from '@amazon-devices/kepler-amazon-device-messaging';
    
     export const App = () => {
     const register = async () => {
         try {
           console.log('调用registerAsync');
           const registrationId: string =
             await AmazonDeviceMessagingServer.registerAsync();
           console.log('注册ID:' + registrationId);
         } catch (error) {
           console.error('注册失败:', error);
         }
       }
     };
    
  3. 创建task.js并通过HeadlessEntryPointRegistry注册HeadlessTask

    已复制到剪贴板。

     import { HeadlessEntryPointRegistry } from "@amazon-devices/headless-task-manager";
    
     import { doTask } from "./src/AdmHeadlessTask";
    
     HeadlessEntryPointRegistry.registerHeadlessEntryPoint("com.amazon.device_messaging.sample.amazon-device-messaging-receiver::doTask",
       () => doTask);
    
  4. 创建AdmHeadlessTask.ts文件。该文件的基本结构采用以下格式。

    已复制到剪贴板。

     class AdmHeadlessTask {
    
       async doTask(): Promise<void> {
         console.log('无头任务已启动');
         return Promise.resolve();
       }
     }
    
     const AdmHeadlessTaskInstance = new AdmHeadlessTask();
    
     export const doTask = (): Promise<void> => {
       return AdmHeadlessTaskInstance.doTask();
     };
    
  5. AdmHeadlessTask.ts中,在处理ADM消息的后台任务中实现AmazonDeviceMessagingHandler接口。

    已复制到剪贴板。

     import {
         AmazonDeviceMessagingServer,
         AmazonDeviceMessagingHandler,
         AmazonDeviceMessagingMessage,
       } from '@amazon-devices/kepler-amazon-device-messaging';
       .
       .
       .
       const handler: AmazonDeviceMessagingHandler = {
         handleOnMessage(message: AmazonDeviceMessagingMessage): Promise<void> {
           // 处理消息
           console.log(
             '应用收到的ADM消息 = ' + JSON.stringify(message.data),
           );
           console.log(
             '应用收到的ADM通知 = ' + JSON.stringify(message.notification),
           );
           return Promise.resolve();
         },
       };
    
  6. 将处理程序作为参数传递给AdmHeadlessTask

    已复制到剪贴板。

     class AdmHeadlessTask {
       private handler: AmazonDeviceMessagingHandler;
       constructor(handler: AmazonDeviceMessagingHandler) {
         this.handler = handler;
       }
       .
       .
       .
     }
    
  7. 调用AmazonDeviceMessagingServer.registerHandler() 注册名为handlerAmazonDeviceMessagingHandler的实现。

    已复制到剪贴板。

     class AdmHeadlessTask {
       .
       .
       .
       async doTask(): Promise<void> {
         console.log('无头任务已启动');
         AmazonDeviceMessagingServer.registerHandler(handler);
         return Promise.resolve();
       }
       .
       .
       .
     }
    
  8. 调用registerHandler方法后,调用waitForMessageHandlerCompletionAsync

    已复制到剪贴板。

     class AdmHeadlessTask {
       .
       .
       .
       async doTask(): Promise<void> {
         console.log('无头任务已启动');
         AmazonDeviceMessagingServer.registerHandler(handler);
         try {
           // 传递等待消息处理完成的最长持续时间。
           // 等待参数是未来的时间戳,在本例中,
           // 是在当前时间之后5000毫秒。
           await AmazonDeviceMessagingServer.waitForMessageHandlerCompletionAsync(
             new Date(Date.now() + 5 * 1000),
           );
         } catch (error) {
             console.error('Error:', error);
         }
         return Promise.resolve();
       }
       .
       .
       .
     }
    
  9. 等待waitForMessageHandlerCompletionAsync完成。如果该方法没有抛出错误,则表示成功处理了消息。如果在处理消息时出现故障,ADM不会重新尝试传送消息。

注意:​ 当处理程序未在通过waitDuration指定的时间内处理消息或处理消息失败时,waitForMessageHandlerCompletionAsync方法会引发一个错误。这些错误会报告给生命周期管理器,由您的应用来处理。

示例AdmHeadlessTask.ts

已复制到剪贴板。

import {
  AmazonDeviceMessagingMessage,
  AmazonDeviceMessagingServer,
  AmazonDeviceMessagingHandler,
} from '@amazon-devices/kepler-amazon-device-messaging';

class AdmHeadlessTask {
  private handler: AmazonDeviceMessagingHandler;
  constructor(handler: AmazonDeviceMessagingHandler) {
    this.handler = handler;
  }

  async doTask(): Promise<void> {
    console.log('后台任务已启动');
    AmazonDeviceMessagingServer.registerHandler(handler);
    try {
      // 传递等待消息处理完成的最长持续时间
      await AmazonDeviceMessagingServer.waitForMessageHandlerCompletionAsync(
        new Date(Date.now() + 5 * 1000),
      );
    } catch (error) {
        console.error('Error:', error);
    }
    console.log('无头任务完成');
    return Promise.resolve();
  }
}

const handler: AmazonDeviceMessagingHandler = {
  handleOnMessage(message: AmazonDeviceMessagingMessage): Promise<void> {
    console.log(
      '示例应用收到的消息 = ' + JSON.stringify(message.data),
    );
    console.log(
      '示例应用收到的通知 = ' +
        JSON.stringify(message.notification),
    );
    return Promise.resolve();
  }
};

const admHeadlessTaskInstance = new AdmHeadlessTask(handler);

export const doTask = (): Promise<void> => {
  return admHeadlessTaskInstance.doTask();
};

模块


Last updated: 2025年11月17日