跳至主要内容
版本:v8

添加移动端

我们的照片库应用程序在完成之前,需要在 iOS、Android 和 Web 上运行 - 所有这些都使用一个代码库。只需要进行一些小的逻辑更改来支持移动平台,安装一些本地工具,然后在设备上运行应用程序。让我们开始吧!

导入平台 API

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

将 Ionic 平台 API 导入到 photo.service.ts 中,该 API 用于检索有关当前设备的信息。在这种情况下,它对于根据应用程序运行的平台(Web 或移动)选择要执行的代码很有用。

import { Platform } from '@ionic/angular';

export class PhotoService {
public photos: UserPhoto[] = [];
private PHOTO_STORAGE: string = 'photos';
private platform: Platform;

constructor(platform: Platform) {
this.platform = platform;
}

// other code
}

特定于平台的逻辑

首先,我们将更新照片保存功能以支持移动设备。在 readAsBase64() 函数中,检查应用程序运行的平台。如果它是“混合”(Capacitor 或 Cordova,两种原生运行时),那么使用 Filesystem readFile() 方法将照片文件读取到 base64 格式。否则,在 Web 上运行应用程序时,使用与以前相同的逻辑。

private async readAsBase64(photo: Photo) {
// "hybrid" will detect Cordova or Capacitor
if (this.platform.is('hybrid')) {
// Read the file into base64 format
const file = await Filesystem.readFile({
path: photo.path!
});

return file.data;
}
else {
// Fetch the photo, read as a blob, then convert to base64 format
const response = await fetch(photo.webPath!);
const blob = await response.blob();

return await this.convertBlobToBase64(blob) as string;
}
}

接下来,更新 savePicture() 方法。在移动设备上运行时,将 filepath 设置为 writeFile() 操作的结果 - savedFile.uri。设置 webviewPath 时,使用特殊的 Capacitor.convertFileSrc() 方法(详细信息请参见此处)。

// Save picture to file on device
private async savePicture(photo: Photo) {
// Convert photo to base64 format, required by Filesystem API to save
const base64Data = await this.readAsBase64(photo);

// Write the file to the data directory
const fileName = Date.now() + '.jpeg';
const savedFile = await Filesystem.writeFile({
path: fileName,
data: base64Data,
directory: Directory.Data
});

if (this.platform.is('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
};
}
}

接下来,返回到我们之前为 Web 实现的 loadSaved() 函数。在移动设备上,我们可以直接将图像标签的源代码 - <img src="x" /> - 设置为 Filesystem 上的每个照片文件,自动显示它们。因此,只有 Web 需要将 Filesystem 中的每个图像读取到 base64 格式。更新此函数以在 Filesystem 代码周围添加一个 *if 语句*

public async loadSaved() {
// Retrieve cached photo array data
const { value } = await Preferences.get({ key: this.PHOTO_STORAGE });
this.photos = (value ? JSON.parse(value) : []) as UserPhoto[];

// Easiest way to detect when running on the web:
// “when the platform is NOT hybrid, do this”
if (!this.platform.is('hybrid')) {
// Display the photo by reading into base64 format
for (let photo of this.photos) {
// Read each saved photo's data from the Filesystem
const readFile = await Filesystem.readFile({
path: photo.filepath,
directory: Directory.Data
});

// Web platform only: Load the photo as base64 data
photo.webviewPath = `data:image/jpeg;base64,${readFile.data}`;
}
}
}

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