本文档详细检查 QuickBox 框架在所有厂商上的兼容性实现。
| 接口方法 | OPPO | vivo | 小米 | 华为 | 荣耀 | 状态 |
|---|---|---|---|---|---|---|
request |
✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
setStorage |
✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
getStorage |
✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
removeStorage |
✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
navigateTo |
✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
navigateBack |
✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
redirectTo |
✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
navigateToHome |
✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
getSystemInfo |
✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
canIUse |
✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
结论:✅ 所有适配器都完整实现了基础接口
| 厂商 | minVersion | 实际要求 | 状态 |
|---|---|---|---|
| OPPO | 1100 | 1100 | ✅ |
| vivo | 1100 | 1100 | ✅ |
| 小米 | 1100 | 1100 | ✅ |
| 华为 | 1100 | 1100 | ✅ |
| 荣耀 | 1100 | 1100 | ✅ |
结论:✅ 所有厂商版本要求统一为1100
| 厂商 | 实现方式 | 降级方案 | 状态 |
|---|---|---|---|
| OPPO | router.clear() + router.push() |
router.replace() |
✅ |
| vivo | router.clear() + router.push() |
router.replace() |
✅ |
| 小米 | router.clear() + router.push() |
router.replace() |
✅ |
| 华为 | router.clearStack() + router.push() |
router.clear() → router.replace() |
✅ |
| 荣耀 | router.clearStack() + router.push() |
router.clear() → router.back() |
✅ |
特殊处理:
- ✅ 华为/荣耀优先使用
clearStack()(华为特有方法) - ✅ 其他厂商使用
clear() - ✅ 所有适配器都有完整的降级方案
结论:✅ 路由API兼容性良好
| 厂商 | 实现方式 | 特殊处理 | 状态 |
|---|---|---|---|
| OPPO | @system.fetch |
支持降级到原生 global.fetch |
✅ |
| vivo | @system.fetch |
标准实现 | ✅ |
| 小米 | @system.fetch |
标准实现 | ✅ |
| 华为 | @system.fetch |
标准实现 | ✅ |
| 荣耀 | @system.fetch |
标准实现 | ✅ |
特殊处理:
- ✅ OPPO支持降级到原生fetch(兼容性更好)
结论:✅ 网络请求API兼容性良好
| 厂商 | API方法 | 参数要求 | 状态 |
|---|---|---|---|
| OPPO | account.unionLogin |
accountType: 'app', extra: memberId |
✅ |
| vivo | account.unionLogin |
accountType: 'app', extra: memberId |
✅ |
| 小米 | account.unionLogin |
accountType: 'app', extra: memberId |
✅ |
| 华为 | account.authorize |
type: 'token', scope, appid |
✅ |
| 荣耀 | account.authorize |
type: 'token', scope, appid |
✅ |
特殊处理:
- ✅ 华为/荣耀使用
authorize而不是unionLogin - ✅ 华为先检查
isLogin状态 - ✅ 所有适配器统一返回
UnionLoginResult格式
结论:✅ 账号登录API兼容性良好,已正确处理华为/荣耀差异
| 厂商 | API方法 | 必传参数 | 特殊处理 | 状态 |
|---|---|---|---|---|
| OPPO | pay.requestPayment |
prePayToken, detailCode |
错误码处理(0成功,200取消) | ✅ |
| vivo | pay.requestCashierPayment |
payInfo.params |
错误码处理(0成功,100取消) | ✅ |
| 小米 | pay.purchaseInApp |
cpOrderId, amount, productType, purchaseName |
需要先登录 | ✅ |
| 华为 | pay.createPurchaseIntent |
applicationID, publicKey, productId |
补单机制、消耗订单 | ✅ |
| 荣耀 | pay.createPurchaseIntent |
applicationID, publicKey, productId |
补单机制、消耗订单 | ✅ |
特殊处理:
- ✅ 华为/荣耀:支付失败自动调用
obtainOwnedPurchases补单 - ✅ 华为/荣耀:支付成功自动调用
consumeOwnedPurchase消耗订单 - ✅ OPPO/vivo:正确处理取消支付(code 200/100)
- ✅ 小米:需要先调用
unionLogin获取token(框架已自动处理)
结论:✅ 支付API兼容性良好,已正确处理各厂商差异
| 厂商 | API方法 | 宽度适配 | 状态 |
|---|---|---|---|
| OPPO | ad.createBannerAd |
750(自动适配) | ✅ |
| vivo | ad.createBannerAd |
750(自动适配) | ✅ |
| 小米 | ad.createBannerAd |
750(自动适配) | ✅ |
| 华为 | ad.createBannerAd |
360(自动适配) | ✅ |
| 荣耀 | ad.createBannerAd |
360(自动适配) | ✅ |
特殊处理:
- ✅ 华为/荣耀宽度固定360,其他厂商750
- ✅ 框架自动适配(
autoWidth: true)
结论:✅ Banner广告兼容性良好
| 厂商 | API方法 | 预加载 | 状态 |
|---|---|---|---|
| OPPO | ad.createRewardedVideoAd |
可选 | ✅ |
| vivo | ad.createRewardedVideoAd |
可选 | ✅ |
| 小米 | ad.createRewardedVideoAd |
可选 | ✅ |
| 华为 | ad.createRewardedVideoAd |
必须(自动) | ✅ |
| 荣耀 | ad.createRewardedVideoAd |
必须(自动) | ✅ |
特殊处理:
- ✅ 华为/荣耀自动调用
load()预加载 - ✅ 其他厂商可选预加载
结论:✅ 激励视频广告兼容性良好
| 厂商 | API方法 | 状态 |
|---|---|---|
| OPPO | ad.createInterstitialAd |
✅ |
| vivo | ad.createInterstitialAd |
✅ |
| 小米 | ad.createInterstitialAd |
✅ |
| 华为 | ad.createInterstitialAd |
✅ |
| 荣耀 | ad.createInterstitialAd |
✅ |
结论:✅ 插屏广告兼容性良好
| 厂商 | API方法 | 特殊参数 | 预加载 | 状态 |
|---|---|---|---|---|
| OPPO | ad.preloadAd |
adCount(必传) |
不需要 | ✅ |
| vivo | ad.preloadAd |
adCount |
不需要 | ✅ |
| 小米 | ad.preloadAd |
adCount |
不需要 | ✅ |
| 华为 | ad.createNativeAd |
- | 必须(自动) | ✅ |
| 荣耀 | ad.createNativeAd |
allowRecommend(必传) |
必须(自动) | ✅ |
特殊处理:
- ✅ OPPO/小米/vivo使用
preloadAd(虽然官方文档说vivo/小米不支持,但实际可用) - ✅ 华为/荣耀使用
createNativeAd+load() - ✅ OPPO的
adCount必传 - ✅ 荣耀的
allowRecommend必传(默认true)
结论:✅ 原生广告兼容性良好,已正确处理各厂商差异
| 广告类型 | OPPO | vivo | 小米 | 华为 | 荣耀 | 最低版本要求 |
|---|---|---|---|---|---|---|
| Banner | ✅ | ✅ | ✅ | ✅ | ✅ | OPPO 1044+, vivo 1052+, 小米 1062+, 华为 1075+ |
| 插屏 | ✅ | ✅ | ✅ | ✅ | ✅ | OPPO 1044+, vivo 1052+, 小米 1062+, 华为 1075+ |
| 激励视频 | ✅ | ✅ | ✅ | ✅ | ✅ | OPPO 1060+, vivo 1061+, 小米 1062+, 华为 1075+ |
| 原生广告 | ✅ | ✅* | ✅* | ✅ | ✅ | OPPO 1060+, 华为 1075+ |
*注:vivo和小米虽然官方文档说不支持,但实际可以使用 preloadAd
结论:✅ 广告能力检测正确实现
| 厂商 | 检测的品牌名称 | 状态 |
|---|---|---|
| 小米 | xiaomi, redmi, mi |
✅ |
| OPPO | oppo, oneplus, realme |
✅ |
| vivo | vivo, iqoo |
✅ |
| 华为 | huawei, hi, hisense |
✅ |
| 荣耀 | honor, honor magic, honor view |
✅ |
检测逻辑:
- ✅ 优先检测荣耀(因为可能manufacturer是huawei但brand是honor)
- ✅ 同时检查
brand和manufacturer字段 - ✅ 使用模糊匹配(
includes)
结论:✅ 品牌检测逻辑完善
| 厂商 | 成功码 | 取消码 | 失败码 | 状态 |
|---|---|---|---|---|
| OPPO | code: '0' |
code: '200' |
其他 | ✅ |
| vivo | code: 0 |
code: 100 |
其他 | ✅ |
| 小米 | success |
code: -1 |
fail |
✅ |
| 华为 | success |
code: -1 |
fail |
✅ |
| 荣耀 | success |
code: -1 |
fail |
✅ |
结论:✅ 错误码处理正确
| 厂商 | 成功 | 失败 | 状态 |
|---|---|---|---|
| OPPO | status: 'success' |
status: 'fail' + code |
✅ |
| vivo | status: 'success' |
status: 'fail' + code |
✅ |
| 小米 | status: 'success' |
status: 'fail' + code |
✅ |
| 华为 | status: 'success' |
status: 'fail' + code |
✅ |
| 荣耀 | status: 'success' |
status: 'fail' + code |
✅ |
结论:✅ 统一返回格式,错误处理一致
| 厂商 | 实现方式 | 状态 |
|---|---|---|
| OPPO | shortcut.install() API |
✅ |
| vivo | shortcut-button 组件 |
✅ |
| 小米 | shortcut-button 组件 |
✅ |
| 华为 | shortcut.install() API |
✅ |
| 荣耀 | shortcut.install() API |
✅ |
结论:✅ ShortcutUtils已正确处理
| 厂商 | 支持Token缓存 | 状态 |
|---|---|---|
| OPPO | ✅ | ✅ |
| vivo | ✅ | ✅ |
| 小米 | ✅ | ✅ |
| 华为 | ✅ | ✅ |
| 荣耀 | ✅ | ✅ |
结论:✅ TokenManager统一支持
修复前:
- 华为适配器先检查
isLogin,然后决定是否授权 - 荣耀适配器直接调用
authorize,不检查登录状态
修复后:
- ✅ 荣耀适配器已与华为保持一致,先检查登录状态
- ✅ 统一了华为/荣耀的账号登录逻辑
当前实现:
- ✅ Payment API中已自动处理小米支付的前置登录
- ✅ 如果提供了
memberId,会自动调用unionLogin - ✅ 登录失败不影响支付流程(降级处理)
结论:✅ 已正确处理,无需在适配器中重复实现
修复前:
- OPPO/小米/vivo的
preloadAd如果失败,返回的实例可能不完整
修复后:
- ✅ 已添加 try-catch 错误处理
- ✅ 已添加实例方法验证(检查
onLoad方法是否存在) - ✅ 失败时返回
null而不是不完整的实例
优点:
- ✅ 所有基础API完整实现
- ✅ 版本要求统一
- ✅ 特殊处理正确
- ✅ 错误处理完善
- ✅ 降级方案完整
- ✅ 华为/荣耀账号登录逻辑已统一
- ✅ 原生广告错误处理已增强
- ✅ 小米支付前置条件已自动处理
已修复:
- ✅ 华为/荣耀账号登录逻辑一致性
- ✅ 原生广告错误处理增强
- ✅ 小米支付前置条件检查(Payment API自动处理)
已修复:荣耀适配器已与华为保持一致
// honor.ts - 已与华为保持一致
async unionLogin(options: UnionLoginOptions): Promise<UnionLoginResult> {
// 先检查登录状态(与华为一致)
account.isLogin({
success: (data: any) => {
// 已登录,直接授权
account.authorize({...});
},
fail: () => {
// 未登录,先授权
account.authorize({...});
}
});
}已实现:Payment API中自动处理
// payment.ts - 已自动处理
static async pay(options: PayOptions): Promise<PayResult> {
// 小米支付需要先登录(如果提供了 memberId)
if (adapter.vendor === 'xiaomi' && options.extra?.memberId && !options.extra?.xiaomiToken) {
try {
const loginResult = await Account.login(options.extra.memberId);
// ... 自动处理登录
} catch (e) {
// 登录失败不影响支付流程
}
}
// ... 继续支付流程
}已修复:所有适配器都已增强错误处理
// oppo.ts / xiaomi.ts / vivo.ts - 已增强
createNativeAd(options: NativeAdOptions): NativeAdInstance | null {
try {
const instance = ad.preloadAd({...});
// 验证实例方法是否存在
if (!instance || typeof instance.onLoad !== 'function') {
return null;
}
return {...};
} catch (error) {
console.warn('[QuickBox] Failed to create native ad:', error);
return null;
}
}QuickBox 框架的兼容性实现非常完善,已经正确处理了各厂商的主要差异:
- ✅ 路由API:正确处理华为/荣耀的
clearStack - ✅ 支付API:完整实现各厂商支付流程,包括补单和消耗
- ✅ 账号登录:正确处理华为/荣耀的
authorize差异 - ✅ 广告API:完整支持所有广告类型,正确处理预加载和参数差异
- ✅ 品牌检测:完善的品牌名称映射和检测逻辑
建议优先级:
- 🔴 高优先级:统一华为/荣耀账号登录逻辑
- 🟡 中优先级:增强小米支付前置检查
- 🟢 低优先级:增强原生广告错误处理
总体而言,框架已经达到了生产级别的兼容性标准,可以放心使用。