跳至主要內容
版本: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.dev.org.tw/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 上運行的程式碼庫。接下來,是您一直在等待的部分 - 將應用程式部署到裝置。