プラグイン API の設計
Capacitor プラグインを構築する際の最初の(そして間違いなく最も重要な)ステップは、API を設計することです。API は、各プラットフォーム固有の実装を書くときに遵守する契約です。
プラグイン API は TypeScript で定義することができ、実装の際に契約書として機能し、コード補完や型チェックといった TypeScript に付随する機能を提供する。
待って。どうしてプラグインが必要なの?
信じられないかもしれません が、最近のウェブブラウザは、バッテリーの状態のチェック、音声認識、画面の向きなど、私たちが「ネイティブ機能」と考える多くのことを行うことができます。Web Native アプリケーションを構築していると、かつてはプラグインが必要だった機能が、Web API として提供されているのを目にすることがあります。
特定の機能のプラグインをビルドする前に、 What Web Can Do Today などのサイトをチェックして、探している機能が Web API としてすでに利用可能かどうかを確認することをお勧めします。
画面指向がすでに Web API を持っているのなら、なぜわざわざ Web API を構築する必要があるのでしょうか。 Screen Orientation Web API を見ると、iOS はこの API を実装していない (この記事を書いている時点では) ことがわかります。Android に関しては、アプリが Android プラットフォーム上で動作している場合には、Screen Orientation Web API を使用することもできますが、学ぶことを目的にして画面向きの機能をネイティブに実装します。
ScreenOrientation API の定義
Screen Orientation Web API をそのまま使用することはできないかもしれませんが、プラグインの API をモデル化することはできます:
Method Name | Input Parameters | Return Value |
---|---|---|
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.ts
index.ts
definitions.ts
に次のコードを入力します:
import type { PluginListenerHandle } from '@capacitor/core';
export interface ScreenOrientationPlugin {
/**
* Returns the screen's current orientation.
*/
orientation(): Promise<{ type: OrientationType }>;
/**
* Locks the screen orientation.
*/
lock(opts: { orientation: OrientationLockType }): Promise<void>;
/**
* Unlocks the screen's orientation.
*/
unlock(): Promise<void>;
/**
* Listens for screen orientation changes.
*/
addListener(
eventName: 'screenOrientationChange',
listenerFunc: (orientation: { type: OrientationType }) => void,
): Promise<PluginListenerHandle> & PluginListenerHandle;
/**
* Removes all listeners
*/
removeAllListeners(): Promise<void>;
}