设计插件 API
构建 Capacitor 插件的第一步——也可以说是最重要的一步——就是设计 API。API 是我们在编写各个平台具体实现时需要遵循的契约。
我们可以使用 TypeScript 来定义插件 API;它将作为我们实现时的契约,并提供 TypeScript 带来的便利,如代码自动补全和类型检查。
等等,你真的需要为这个功能写插件吗?
信不信由你,现代网络浏览器已经可以实现许多我们认为的“原生功能”,例如检查电池状态、语音识别,是的,还包括屏幕方向。在构建 Web Native 应用时,常常会发现过去需要插件才能实现的功能,现在已作为 Web API 提供 。
在为特定功能构建插件之前,我们建议先查看像 What Web Can Do Today 这样的网站,看看你需要的功能是否已作为 Web API 提供。
既然屏幕方向已经有了 Web API,为什么我们还要费心自己构建一个呢?查看 屏幕方向 Web API 可以发现,iOS 并未实现这个 API(截至本文撰写时),这意味着我们需要自己提供实现。对于 Android 平台,当应用运行时,我们本可以直接使用屏幕方向 Web API——但为了教学目的,我们将原生实现屏幕方向功能。
定义 ScreenOrientation API
我们可能无法直接使用屏幕方向 Web API,但可以参照它来设计我们插件的 API:
| 方法名称 | 输入参数 | 返回值 |
|---|---|---|
| orientation | Promise<{ type: OrientationType }> | |
| lock | { orientation: OrientationLockType } | Promise<void> |
| unlock | Promise<void> | |
| addListener | (orientation: { type: OrientationType }) | Promise<PluginListenerHandle> & PluginListenerHandle |
| removeAllListeners | Promise<void> |
这里有一个额外的好处:我们可以使用 TypeScript 现有 DOM 类型定义中提供的 OrientationType 和 OrientationLockType 类型。
让我们设置一个目录来存放插件 API。创建一个新的子文件夹 src/plugins/screen-orientation,并在其中添加以下文件:
definitions.tsindex.ts
在 definitions.ts 中填充以下代码:
import type { PluginListenerHandle } from '@capacitor/core';
export interface ScreenOrientationPlugin {
/**
* 返回屏幕当前方向。
*/
orientation(): Promise<{ type: OrientationType }>;
/**
* 锁定屏幕方向。
*/
lock(opts: { orientation: OrientationLockType }): Promise<void>;
/**
* 解锁屏幕方向。
*/
unlock(): Promise<void>;
/**
* 监听屏幕方向变化。
*/
addListener(
eventName: 'screenOrientationChange',
listenerFunc: (orientation: { type: OrientationType }) => void,
): Promise<PluginListenerHandle> & PluginListenerHandle;
/**
* 移除所有监听器。
*/
removeAllListeners(): Promise<void>;
}
注册 ScreenOrientation 插件
为了在 Capacitor 应用中使用该插件,我们需要使用从 @capacitor/core 导出的 registerPlugin() 模块来注册它。
在 index.ts 中填充以下代码:
import { registerPlugin } from '@capacitor/core';
import type { ScreenOrientationPlugin } from './definitions';
const ScreenOrientation = registerPlugin<ScreenOrientationPlugin>(
'ScreenOrientation',
);
export * from './definitions';
export { ScreenOrientation };
上面的代码创建了一个链接到我们插件实现代码的对象。
API 设计已完成;接下来让我们构建一个用户界面来调用它。这样做将使我们在实现每个平台集成时更容易进行测试。下一步:使用插件 API。