updateStatus方法和handleReadStatus回调函数。updateStatus方法报告应用的当前登录状态,以便在身份验证状态发生变化时进行实时更新。handleReadStatus回调函数可以响应有关应用当前登录状态的系统查询。两种方法都使用StatusType来表示账户状态,可能有两个值:SIGNED_IN和SIGNED_OUT。
Vega媒体账户登录API参考
有关此API的参考文档,请参阅账户登录API。Vega媒体账户登录常见用例
如果出现以下情况,应用应向系统更新其登录状态:- 应用最初启动时。
- 用户的订阅状态发生变化时。
- 收到其他服务的请求。
安装和设置Vega媒体账户登录
步骤1:更新应用清单
使用服务组件来处理账户登录交互的一部分。熟悉服务组件,也称为无头组件。让一项服务与交互式组件一起运行,使这种集成更易于执行和故障排除。请参阅服务组件文档。 首先,更新您的应用清单以使用Vega媒体账户登录API。修改清单条目时,请将com.amazondeveloper.media.sample替换为应用的程序包ID,如下例所示。开发者通常将账户登录API通常作为一项服务来实现,以提供账户登录状态,尤其是在读取操作期间。不要求用户打开基于交互式界面的应用。开发者通常以交互式应用的形式实现媒体提供方应用,以处理用户界面。您的交互式和服务应用应交换账户登录信息。可以使用共享文件或其他进程间通信机制来交换账户登录信息。
以下示例展示了内容启动器和账户登录API的示例清单。它定义了交互式组件和服务组件。
- 用于查找和启动内容的内容启动器集群API
- Vega媒体控制API,用于控制启动的媒体
- 账户登录API用于向系统传达账户登录状态
interface.provider键指定,如以下TOML代码段和前面的示例所示。
步骤2:纳入程序包依赖项
Vega媒体账户登录API通过系统Turbo模块amzn/kepler-media-account-login提供给TypeScript开发者。这个Turbo模块是SDK程序包的一部分。要使用该API,请更新package.json文件以将Turbo模块作为依赖项,然后添加amzn/headless-task-manager来创建无头服务应用。
步骤3:添加Vega媒体账户登录业务逻辑
创建一个名为AccountLoginWrapper.ts的文件,以包含Vega媒体账户登录API的核心业务逻辑。在此文件中,创建并导出一个名为AccountLoginWrapper的类。这个类只有一个成员变量:IAccountLoginServerAsync接口的实例,用于与账户登录服务器进行交互。该文件还会在全局创建一个AccountLoginServerComponent的实例,并将其存储在名为accountLoginServerComponent的变量中。
步骤4:异步返回账户登录状态
现在使用IAccountLoginHandlerAsync接口,实现不采用任何参数并返回Promise<IStatus>的handleReadStatus() 方法。通过采用这种方式设计方法,服务应用可以在不屏蔽调用者的情况下异步返回账户登录状态。Promise<IStatus>返回类型表明,该方法最终会使用一个IStatus对象(其中可能包含有关当前登录状态的信息)进行解析。 稍后在步骤8中创建的无头服务调用handleReadStatus() 处理程序。由于交互式组件(用户界面应用)和无头服务在不同的进程中运行,因此它们不共享内存状态。依赖内存中的变量是不够的。为确保两个组件之间的可靠通信,请使用共享机制来持久存储和传输登录状态。必须从该永久性存储器异步读取登录状态。目前,无头服务支持React的AsyncStorage和Vega文件系统。MMKV不受支持。此示例使用了AsyncStorage。
以下是一些利用AsyncStorage的组件实现示例。
handleReadStatus() 处理程序以在系统调用它时返回登录状态。如前所示,getLoginStatus() 必须通过永久性存储器读取状态。getLoginStatus() 是特定于应用的。
步骤5:初始化账户登录服务器并将其链接到组件处理器
接下来,在AccountLoginWrapper类中引入setupAccountLoginServer() 方法。此方法可接受IComponentInstance对象作为参数。按以下方式实现它:
-
创建
IAccountLoginServerAsync的单例实例并将其存储在成员变量accountLoginServer中。 -
接下来,调用
setHandlerForComponent(),传入在步骤4中创建的handleReadStatus()处理程序以及已提供的ComponentInstance。
步骤6:更新账户登录状态
要更新账户登录状态,请异步使用updateStatus() 方法。在调用此函数之前,请务必将登录状态存储在永久存储器中。
步骤7:将账户登录服务器与服务生命周期集成
为了进行这种集成,AccountLoginWrapper类公开了两种方法:onStart() 和onStop()。
onStart()
onStart() 方法通过使用提供的IComponentInstance调用setupAccountLoginServer() 来初始化账户登录服务器。
onStop()
onStop() 方法添加了服务停止时所需的清理逻辑。
实现这些方法后,创建一个名为AccountLoginWrapperInstance的单例实例,并使用它来公开两个等效顶级方法:onStartService() 和onStopService()。对服务和交互式组件使用这些方法来启动和停止账户登录服务器。
步骤8:实现无头服务
无头服务属于后台进程,可在没有用户界面的情况下利用自带的React Native运行时运行。此服务是响应登录状态请求的关键,是通过以下步骤创建的:- 在应用的根目录中创建一个名为service.js的新文件。
-
导入在前面的步骤中创建的
AccountLoginWrapper,并导入headless-task-manager。 -
定义起始和停止入口点。
- 将
com.amazondeveloper.media.sample替换为您应用的实际程序包ID。 - 入口点命名惯例如下:<应用程序包ID>.interface.provider::onStartService或::onStopService。
- 将
onStartService(),将账户登录服务器初始化为无头服务。在此过程中,将为特定服务组件实例注册handleReadStatus() 函数。
当系统稍后调用此处理程序时,handleReadStatus() 返回应用报告的当前登录状态(登录或注销)。
步骤9:初始化账户登录服务器以报告登录状态
交互式组件(用户界面应用)还必须初始化账户登录服务器,以使用updateStatus() 方法报告用户的登录状态。
步骤10:发送登录状态更新
在以下情况下,交互式组件(用户界面应用)必须使用当前登录状态调用updateStatus() 方法:
- 用户启动应用时。
- 用户的登录状态发生变化时。
updateStatus() 之前,将状态存储在永久存储器中,以便handleReadStatus() 能够检索并返回正确的值。这样,系统就能始终如一地反映用户的身份验证状态,从而提供流畅的用户体验。
此设置让您的应用能够管理登录状态请求,即使主应用并未活跃运行。
您现在已经创建了IAccountLoginServerComponentAsync的单个实例。系统会在handleReadStatus() 方法和IComponentInstance之间建立联系,从而让所有读取请求都指向服务组件。这样做可处理账户登录状态查询。调用updateStatus() 方法来强制执行登录状态更新,或者只要状态变化就随时更新。
Vega媒体账户登录故障排除
与账户登录集成时可能会出现一些问题,但以下是一些更常见的问题。确认服务组件启动
看看您的updateStatus() 调用是否被拾取。如果是这样,则服务组件会在不崩溃的情况下启动。
可以通过在运行vega device launch-app com.your.app.id.interface.provider之前捕获日志来检查updateStatus() 调用,并密切关注服务组件完成其启动序列的过程。检查与您的服务组件名称相对应的日志,并查看在此阶段是否发生任何崩溃。在到达registerHeadlessEntryPoint() (onStartService) 入口点之后,找到日志。
如果根据日志,您遇到了故障或崩溃,Vega崩溃调试文档或许可以提供非常实用的参考信息。
确认处理程序已调用
确定服务已成功启动后,使用setHandlerForComponent() 确认您的服务正确注册了处理程序。您可以围绕此调用添加日志,以确认沿循的是此路径。可以找到您的服务组件对应的handle_set_response_handler等效日志,以便进行确认。
围绕handleReadStatus() 添加日志,以确认它能按预期运行。

