Capacitor Web/PWA 插件指南
Capacitor 利用 Web/原生兼容层,使得构建同时在原生环境以及 Web 上的 PWA 中运行的插件变得容易。
开始
首先,按照插件指南的开始部分中的说明生成一个插件。
接下来,在你选择的编辑器中打开 echo/src/web.ts。
示例
Capacitor Web 插件的基本结构如下:
import { WebPlugin } from '@capacitor/core';
import type { EchoPlugin } from './definitions';
export class EchoWeb extends WebPlugin implements EchoPlugin {
async echo(options: { value: string }) {
console.log('ECHO', options);
return options;
}
}
EchoPlugin 接口定义了插件的方法签名。在 TypeScript 中,我们可以确保 Web 实现(EchoWeb 类)正确地实现了该接口。
权限
如果你的插件在 Web 上需要最终用户的权限才能运行,那么你需要实现权限模式。
别名
你需要开发一个或多个别名,用于抽象和分组你的插件所需的权限 。这些别名用于传达权限状态。默认情况下,别名可以处于以下状态之一:
granted(已授权):此别名中的每个权限都已被最终用户授予(或无需提示)。denied(已拒绝):此别名中的一个或多个权限已被最终用户拒绝。prompt(需提示):应提示最终用户授予权限,因为既未授予也未拒绝。prompt-with-rationale(需提示并说明理由):最终用户之前已拒绝权限,但尚未屏蔽提示。
这些状态由 @capacitor/core 导出的 PermissionState 类型表示。
如有需要,也可以为别名定义自定义状态。例如,官方的 Camera 插件 还为 camera 和 photos 别名定义了 limited(受限)状态。
别名是跨平台的,因此在确定插件的别名时,请确保考虑到 iOS、Android 和 Web 的权限。
权限状态定义
在 src/definitions.ts 中,从 Capacitor 导入 PermissionState,并定义一个 PermissionStatus 接口,该接口以你确定的别名为键,表示插件中的权限状态。
在下面的示例中,权限状态可以完全由一个 location 别名表示,该别名可以是 granted、denied 等。
import type { PermissionState } from '@capacitor/core';
export interface PermissionStatus {
// TODO:将 'location' 改为你实际使用的别名名称!
location: PermissionState;
}
然后,在你的插件接口中添加 checkPermissions() 和 requestPermissions() 的定义。这两个方法都将返回插件中权限的当前状态,如 PermissionStatus 所定义。
export interface EchoPlugin {
echo(options: { value: string }): Promise<{ value: string }>;
+ checkPermissions(): Promise<PermissionStatus>;
+ requestPermissions(): Promise<PermissionStatus>;
}
由于这些方法已添加到你的插件接口中,因此必须在你的插件支持的所有平台上实现它们。
实现权限
在 src/web.ts 中,将 checkPermissions() 和 requestPermissions() 方法添加到你的 Web 实现中。
+import { PermissionStatus } from './definitions';
export class EchoWeb extends WebPlugin implements EchoPlugin {
async echo(options: { value: string }) {
...
}
+ async checkPermissions(): Promise<PermissionStatus> {
+ // TODO
+ }
+ async requestPermissions(): Promise<PermissionStatus> {
+ // TODO
+ }
}
checkPermissions()
此方法应返回插件中权限的当前状态。此信息可能直接从特定的 Web API 获取,或通过权限 API 获取。
请记住,在处理浏览器支持不完善的 Web API(如权限 API)时,你应实现特性检测,并在最终用户的浏览器不支持时抛出适当的错误。
async checkPermissions(): Promise<PermissionStatus> {
+ if (typeof navigator === 'undefined' || !navigator.permissions) {
+ throw this.unavailable('