2025-07-17 15:44:34 +08:00

79 lines
2.8 KiB
TypeScript

import * as BackgroundFetch from 'expo-background-task';
import * as TaskManager from 'expo-task-manager';
import { isFileUploaded, markFileAsUploaded } from './db';
import { getMediaByDateRange } from './media';
const BACKGROUND_UPLOAD_TASK = 'background-upload-task';
// 注册后台任务
export const registerBackgroundUploadTask = async () => {
try {
// 初始化数据库表
// initUploadTable();
// 检查是否已经注册了任务
const isRegistered = await TaskManager.isTaskRegisteredAsync(BACKGROUND_UPLOAD_TASK);
if (isRegistered) {
await BackgroundFetch.unregisterTaskAsync(BACKGROUND_UPLOAD_TASK);
}
// 注册后台任务
await BackgroundFetch.registerTaskAsync(BACKGROUND_UPLOAD_TASK, {
minimumInterval: 15 * 60, // 15 分钟
});
console.log('Background task registered');
return true;
} catch (error) {
console.error('Error registering background task:', error);
return false;
}
};
// 定义后台任务
TaskManager.defineTask(BACKGROUND_UPLOAD_TASK, async () => {
try {
const now = new Date();
const oneDayAgo = new Date(now.getTime() - 24 * 60 * 60 * 1000);
// 获取最近24小时的媒体文件
const media = await getMediaByDateRange(oneDayAgo, now);
// 过滤已上传文件(以 uri 为唯一标识)
const filesToUpload = [];
for (const file of media) {
const uploaded = await isFileUploaded(file.uri);
if (!uploaded) filesToUpload.push(file);
}
if (filesToUpload.length === 0) {
console.log('No media files to upload');
return BackgroundFetch.BackgroundTaskResult.Success;
}
// 上传未上传文件
let successCount = 0;
for (const file of filesToUpload) {
// 这里假设有 uploadSingleMedia 函数,或直接使用 index.ts 的 processMediaUpload
try {
// 你可以根据实际情况替换为自己的上传逻辑
const { processMediaUpload } = await import('./index');
const result = await processMediaUpload(file);
if (result.originalSuccess) {
markFileAsUploaded(file.uri);
successCount++;
}
} catch (e) {
console.error('Upload failed for', file.uri, e);
}
}
console.log(`Background upload completed. Success: ${successCount}/${filesToUpload.length}`);
return successCount > 0
? BackgroundFetch.BackgroundTaskResult.Success
: BackgroundFetch.BackgroundTaskResult.Failed;
} catch (error) {
console.error('Background task error:', error);
return BackgroundFetch.BackgroundTaskResult.Failed;
}
});