fix: 尝试安卓优化

This commit is contained in:
2026-08-02 21:18:51 +08:00
parent 371a7a4582
commit 948a06a55e
4 changed files with 124 additions and 6 deletions

View File

@@ -0,0 +1,71 @@
/**
* 安卓专项优化iOS 保持原逻辑)
*
* - 检测是否为安卓
* - 提供图片 URL 改写工具:把阿里云 OSS 图压缩为 750px 宽 + webp
* 仅对安卓生效iOS 原样返回,确保 iOS 视觉体验不变
*/
const isAndroidClient = (() => {
if (typeof navigator === 'undefined') return false
const ua = navigator.userAgent || ''
// 排除 ChromeOS / Android 的 CrOS 伪装;保留真正的 Android 移动端
return /Android/i.test(ua) && !/CrOS/i.test(ua)
})()
export const isAndroid = isAndroidClient
const OSS_HOST = 'aliyuncs.com'
const PROC_750 = 'image/resize,w_750,lfit/format,webp/q,85'
/**
* 判断 URL 是否为阿里云 OSS 图(仅处理 OSS 图,不影响其它域/本地/blob URL
*/
const isOssImage = (url) => {
if (typeof url !== 'string') return false
const u = url.trim()
if (!u || u.startsWith('data:') || u.startsWith('blob:')) return false
// 仅 http/https
if (!/^https?:\/\//i.test(u)) return false
// 排除图标/iconify 等非图片
if (/iconify\.design|\.svg(\?|$)/i.test(u)) return false
return u.includes(OSS_HOST)
}
/**
* 对单张 OSS 图片 URL 追加 OSS 处理参数(仅安卓)
* - 已存在 x-oss-process 时合并/覆盖 resize 与 format
* - 不改变非 OSS URL
*
* 注意:默认禁用(如下一行 return。如需启用注释掉该行。
* 之前出现"图片加载不出来",是因为部分 OSS 桶未开启图片处理服务 /
* 或 URL 已是 webp再叠加 format,webp 在某些 bucket 配置下返回 400。
* 启用前请确认你的 OSS 已开通 "图片处理" 服务且支持 x-oss-process。
*/
export const optimizeImageUrl = (url) => {
return url
/* eslint-disable no-unreachable */
if (!isAndroidClient) return url
if (!isOssImage(url)) return url
const u = url.trim()
// 已有 x-oss-process替换其中 resize / format
const qIdx = u.indexOf('?x-oss-process=')
if (qIdx >= 0) {
const before = u.slice(0, qIdx)
let proc = u.slice(qIdx + '?x-oss-process='.length)
proc = proc
.split('/')
.filter((seg) => !seg.startsWith('resize') && !seg.startsWith('format') && !seg.startsWith('q'))
.join('/')
const merged = proc ? `${PROC_750}/${proc}` : PROC_750
return `${before}?x-oss-process=${merged}`
}
return `${u}?x-oss-process=${PROC_750}`
/* eslint-enable no-unreachable */
}
/**
* 批量优化(供 normalizeImages 等使用)
*/
export const optimizeImageUrls = (urls = []) =>
urls.map((u) => optimizeImageUrl(u))