feat(push): integrate Honor and Xiaomi push plugins with related updates
This commit is contained in:
@@ -39,18 +39,28 @@ export interface VersionCheckResult {
|
||||
hasUpdate: boolean;
|
||||
currentVersion: string;
|
||||
latestVersion: string;
|
||||
runtimeVersion: string;
|
||||
downloadUrl: string;
|
||||
size: number;
|
||||
}
|
||||
|
||||
/**
|
||||
* 比较版本号
|
||||
* 比较语义版本号(SemVer 三段数字)
|
||||
* 返回: 1 表示 v1 > v2, -1 表示 v1 < v2, 0 表示相等
|
||||
*
|
||||
* 注意:仅做 x.y.z 形式的纯数字比较;任何一段非数字(NaN)会被当作 0 处理,
|
||||
* 避免运行时版本号(commit count 等)混入时导致方向相反的误判。
|
||||
*/
|
||||
function compareVersions(v1: string, v2: string): number {
|
||||
const parts1 = v1.split('.').map(Number);
|
||||
const parts2 = v2.split('.').map(Number);
|
||||
|
||||
const parts1 = v1.split('.').map((s) => {
|
||||
const n = Number.parseInt(s, 10);
|
||||
return Number.isFinite(n) ? n : 0;
|
||||
});
|
||||
const parts2 = v2.split('.').map((s) => {
|
||||
const n = Number.parseInt(s, 10);
|
||||
return Number.isFinite(n) ? n : 0;
|
||||
});
|
||||
|
||||
for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) {
|
||||
const p1 = parts1[i] || 0;
|
||||
const p2 = parts2[i] || 0;
|
||||
@@ -86,10 +96,10 @@ async function fetchLatestAPKVersion(): Promise<APKVersionInfo | null> {
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取当前应用版本
|
||||
* 获取当前应用语义版本(来自 app.json / app.config.js 的 expo.version)
|
||||
*/
|
||||
function getCurrentVersion(): string {
|
||||
return Constants.expoConfig?.version || '1.0.0';
|
||||
return Constants.expoConfig?.version || '1.0.1';
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -144,6 +154,7 @@ async function downloadAndInstallAPK(downloadUrl: string, version: string): Prom
|
||||
}
|
||||
|
||||
try {
|
||||
// 文件名带语义版本(用户可读);runtimeVersion 已在 downloadUrl 中体现
|
||||
const downloadPath = `${FileSystem.documentDirectory}with-you-${version}.apk`;
|
||||
|
||||
// 显示下载进度
|
||||
@@ -247,15 +258,18 @@ export async function checkForAPKUpdate(force: boolean = false): Promise<Version
|
||||
}
|
||||
|
||||
const currentVersion = getCurrentVersion();
|
||||
// 远端必须返回独立的语义版本号;若缺失才回退到 runtimeVersion(不推荐但兜底)
|
||||
const latestVersion = latestAPK.versionName || latestAPK.runtimeVersion;
|
||||
const remoteRuntimeVersion = latestAPK.runtimeVersion;
|
||||
|
||||
// 比较版本
|
||||
// 比较版本(仅基于语义版本,不受 buildNumber / runtimeVersion 影响)
|
||||
const comparison = compareVersions(currentVersion, latestVersion);
|
||||
|
||||
|
||||
const result: VersionCheckResult = {
|
||||
hasUpdate: comparison < 0,
|
||||
currentVersion,
|
||||
latestVersion,
|
||||
runtimeVersion: remoteRuntimeVersion,
|
||||
downloadUrl: latestAPK.downloadUrl,
|
||||
size: latestAPK.size,
|
||||
};
|
||||
|
||||
@@ -41,6 +41,9 @@ export interface UploadResponse {
|
||||
height?: number;
|
||||
size?: number;
|
||||
type?: string;
|
||||
// 文件上传专用字段(POST /uploads/files 返回)
|
||||
name?: string;
|
||||
mime_type?: string;
|
||||
}
|
||||
|
||||
// 上传服务类
|
||||
@@ -130,22 +133,23 @@ class UploadService {
|
||||
}
|
||||
}
|
||||
|
||||
// 上传文件(通用)
|
||||
// 上传文件(通用,对接后端 POST /uploads/files)
|
||||
// 后端返回 { url, name, size, mime_type }
|
||||
async uploadFile(
|
||||
file: {
|
||||
uri: string;
|
||||
name?: string;
|
||||
type?: string;
|
||||
},
|
||||
folder: string = 'general'
|
||||
folder: string = 'chat'
|
||||
): Promise<UploadResponse | null> {
|
||||
try {
|
||||
const response = await api.upload<UploadResponse>('/upload/file', {
|
||||
const response = await api.upload<UploadResponse>('/uploads/files', {
|
||||
uri: file.uri,
|
||||
name: file.name || `file_${Date.now()}`,
|
||||
type: file.type || 'application/octet-stream',
|
||||
}, { folder });
|
||||
|
||||
|
||||
return response.data;
|
||||
} catch (error) {
|
||||
console.error('上传文件失败:', error);
|
||||
|
||||
Reference in New Issue
Block a user