モバイルアプリの追加
私たちのフォトギャラリーアプリは、iOS、Android、そしてウェブ上で動作するまで完成しません。すべてを一つのコードベースで実現します。モバイルプラットフォームをサポートするには、わずかなロジックの変更、いくつかのネイティブツールのインストール、そしてデバイス上でのアプリの実行を行うだけです。始めましょう!
まずは小さなコード変更から始めましょう。そうすれば、アプリをデバイスにデプロイしたときに「そのまま動作」するようになります。
プラットフォーム固有のロジック
まず、モバイルをサポートするように写真の保存機能を更新します。`savePicture` 関数内で、アプリが実行されているプラットフォームを確認します。「ハイブリッド」(Capacitor または Cordova、2つのネイティブランタイム)の場合、`readFile` メソッドを使用して写真を base64 形式で読み取ります。また、Filesystem API を使用して写真の完全なファイルパスを返します。`webviewPath` を設定する際には、特別な `Capacitor.convertFileSrc` メソッドを使用します(詳細はこちら)。それ以外の場合は、ウェブでアプリを実行する場合と同じロジックを使用します。
const savePicture = async (photo: Photo, fileName: string): Promise<UserPhoto> => {
let base64Data: string | Blob;
// "hybrid" will detect Cordova or Capacitor;
if (isPlatform('hybrid')) {
const file = await Filesystem.readFile({
path: photo.path!,
});
base64Data = file.data;
} else {
base64Data = await base64FromPath(photo.webPath!);
}
const savedFile = await Filesystem.writeFile({
path: fileName,
data: base64Data,
directory: Directory.Data,
});
if (isPlatform('hybrid')) {
// Display the new image by rewriting the 'file://' path to HTTP
// Details: https://ionic.dokyumento.jp/docs/building/webview#file-protocol
return {
filepath: savedFile.uri,
webviewPath: Capacitor.convertFileSrc(savedFile.uri),
};
} else {
// Use webPath to display the new image instead of base64 since it's
// already loaded into memory
return {
filepath: fileName,
webviewPath: photo.webPath,
};
}
};
次に、`loadSaved` 関数に新しいロジックを追加します。モバイルでは、Filesystem 上の各写真ファイルに直接アクセスして自動的に表示できます。しかし、ウェブでは、Filesystem API は内部的に IndexedDB を使用しているため、Filesystem から各画像を base64 形式で読み取る必要があります。`useEffect` 内の `loadSaved` 関数を次のように更新します。
const loadSaved = async () => {
const { value } = await Preferences.get({ key: PHOTO_STORAGE });
const photosInPreferences = (value ? JSON.parse(value) : []) as UserPhoto[];
// If running on the web...
if (!isPlatform('hybrid')) {
for (let photo of photosInPreferences) {
const file = await Filesystem.readFile({
path: photo.filepath,
directory: Directory.Data,
});
// Web platform only: Load the photo as base64 data
photo.webviewPath = `data:image/jpeg;base64,${file.data}`;
}
}
setPhotos(photosInPreferences);
};
これで、私たちのフォトギャラリーは、ウェブ、Android、iOS で動作する単一のコードベースで構成されるようになりました。次は皆さんお待ちかねの、アプリをデバイスにデプロイする手順です。