使用Capacitor LiveUpdate插件对接自托管服务时遇到的系列问题
Capacitor LiveUpdate插件对接自托管服务时遇到的系列问题
我来帮你逐个排查这些自托管场景下的LiveUpdate问题,都是实际使用中容易踩的坑:
1. LiveUpdate.getCurrentBundle() 总是返回 {bundleId: null}
这是自托管模式的正常表现——CapAwesome的LiveUpdate插件在自托管时不会自动持久化已安装的bundle状态,不像官方云服务有内置的状态跟踪。第一次启动时没有任何bundle被安装,或者之前从未成功完成过bundle安装流程,都会返回null。
解决思路:不要完全依赖这个方法,而是用Capacitor的Storage API自己维护当前已安装的bundle版本号。
2. iOS上调用 setBundle() 提示未实现
这个是插件的平台差异设计——iOS平台确实没有实现setBundle()方法,因为iOS的bundle替换逻辑和Android不同,插件本身会在安装bundle后自动处理状态。
解决思路:调用该方法前先判断平台,避免在iOS上执行:
import { Capacitor } from '@capacitor/core'; // 仅在Android平台调用setBundle if (Capacitor.getPlatform() === 'android') { await LiveUpdate.setBundle({ bundleId: version }); }
3. 无法判断何时下载新包
结合前面的问题,我们可以自己维护版本状态,流程如下:
- 用
Storage存储当前已激活的bundle版本号 - 从自托管接口获取最新版本号后,和本地存储的版本对比
- 如果最新版本更大,才触发下载流程
4. 处理“Bundle already exists”异常导致后续流程中断
这个异常是预期的,说明该版本的bundle已经下载过了。我们可以在catch块中捕获这个特定错误,直接执行后续的ready()和reload()逻辑,而不是中断整个流程。
修改后的代码示例
import { LiveUpdate } from '@capawesome/capacitor-live-update'; import { Storage } from '@capacitor/storage'; import { App, Capacitor } from '@capacitor/core'; const getBundleInfo = async () => { try { const request = await fetch("https://example.com/app-versions.php", { method: "GET", headers: { "Content-Type": "application/json", "Accept": "application/json", } }) const result = await request.json(); let appVersion = ''; if (result.length > 0) { appVersion = result[result.length - 1].version console.log("Latest version is: " + appVersion) } return appVersion; } catch (error) { console.error(error) } } const getCurrentInstalledBundle = async () => { // 从Storage获取已安装的bundle版本,没有则用原生APP版本 const { value } = await Storage.get({ key: 'current_bundle_version' }); if (value) return value; const appInfo = await App.getInfo(); return appInfo.version; } (async () => { if (Capacitor.isNativePlatform()) { try { const currentBundle = await getCurrentInstalledBundle(); const latestVersion = await getBundleInfo(); if (latestVersion && latestVersion !== currentBundle) { try { await LiveUpdate.downloadBundle({ url: `https://example.com/build-v${latestVersion}.zip`, bundleId: latestVersion, }); // 下载成功后保存版本到Storage await Storage.set({ key: 'current_bundle_version', value: latestVersion }); } catch (downloadError) { // 捕获"Bundle already exists"异常,不中断流程 if (!downloadError.message.includes('Bundle already exists')) { alert(downloadError); return; } // 已经存在的话,也更新本地存储(防止之前没保存) await Storage.set({ key: 'current_bundle_version', value: latestVersion }); } // 不管是新下载还是已存在,都执行后续激活和重载 await LiveUpdate.ready(); await LiveUpdate.reload(); } } catch (error) { alert(error) } } })();
备注:内容来源于stack exchange,提问作者Sachin Kumar
相关产品推荐
相关产品推荐

