跳至主要内容
版本: v8

添加移动端

我们的照片库应用程序只有在 iOS、Android 和 Web 上运行才算完整 - 所有这些都使用一个代码库。所需做的只是对逻辑进行一些小的更改以支持移动平台,安装一些原生工具,然后在设备上运行应用程序。让我们开始吧!

让我们从进行一些小的代码更改开始 - 然后,当我们将应用程序部署到设备时,它将“正常工作”。

平台特定逻辑

首先,我们将更新照片保存功能以支持移动端。在 savePicture 函数中,检查应用程序运行的平台。如果它是“混合”的(Capacitor 或 Cordova,这两个原生运行时),则使用 readFile 方法将照片文件读入 base64 格式。此外,使用 Filesystem API 返回照片的完整文件路径。当设置 webviewPath 时,请使用特殊的 Capacitor.convertFileSrc 方法 (详细信息请参见此处)。否则,在 Web 上运行应用程序时使用与之前相同的逻辑。

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.js.cn/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 上的每个照片文件并自动显示它们。然而,在 Web 上,我们必须将每个图像从 Filesystem 读取到 base64 格式。这是因为 Filesystem API 在后台使用 IndexedDB。更新 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);
};

我们的照片库现在包含一个代码库,可以在 Web、Android 和 iOS 上运行。接下来,就是你一直在等待的部分 - 将应用程序部署到设备。