# Ruční aktualizace bundlů Capacitor bez obchodů s aplikacemi
Mobilní aplikace na Capacitor vyžadují úplné vydání do obchodů i pro drobné úpravy JS kódu nebo specifikací. Bez změn nativního kódu proces schvalování v Google Play, RuStore, AppGallery a App Store trvá dny. Automatizace pomáhá, ale moderace je nevyhnutelná.
Řešení – aktualizace obsahu adresáře dist (nebo build) bez přestavby nativní části. Plugin @capgo/capacitor-updater umožňuje nahrazovat bundl over-the-air v manuálním nebo automatickém režimu.
Soulad s pravidly obchodů
Aktualizace JS bundlů jsou povoleny všemi platformami při dodržení podmínek:
- Google Play: interpretovatelný kód (JS) je přípustný, pokud neporušuje pravidla zneužívání zdrojů.
- App Store: nahraný kód nemění účel aplikace, nevytváří obchod s kódy a neobchází bezpečnost WebView.
Podmínky se splňují automaticky pro hybridní aplikace na Capacitor.
Instalace a nastavení
Instalujte závislosti:
npm i @capgo/capacitor-updater compare-versions
Do capacitor.config.ts přidejte:
plugins: {
CapacitorUpdater: {
autoUpdate: false,
},
},
Režim autoUpdate: false zapíná manuální řízení aktualizací.
Vytvořte provider AppUpdateProvider pro React (upravte pro svůj framework):
const AppUpdateProvider: FC<PropsWithChildren> = ({ children }) => {
return children;
};
export default AppUpdateProvider;
Logika aktualizace
V provideru zavolejte CapacitorUpdater.notifyAppReady() během prvních 10 sekund spuštění – jinak chyba.
Získejte údaje o nejnovějším vydání přes API (GitHub nebo interní službu). Porovnejte verze pomocí compare-versions.
Příklad úplného useEffect:
useEffect(() => {
if (appRelease === null) {
dispatch(getAppRelease({ type: ReleaseType.APP, last: true }));
} else {
const downloadBundle = async () => {
dispatch(setAppUpdating(true));
return CapacitorUpdater.download({
url: APP_BUNDLE_DOWNLOAD_LINK,
version: appRelease.version,
});
};
CapacitorUpdater.addListener('downloadComplete', async ({ bundle: downloadedBundle }) => {
try {
await CapacitorUpdater.set(downloadedBundle);
dispatch(setAppUpdating(false));
} catch (e) {
console.error(e);
dispatch(setAppUpdating(false));
}
});
if (compare(String(version), appRelease.version, '<')) downloadBundle();
return () => {
CapacitorUpdater.removeAllListeners();
App.removeAllListeners();
};
}
}, [appRelease]);
Příprava bundlu
Archiv bundlu vytvořte striktně přes Capgo CLI:
npx @capgo/cli bundle zip [appId] --name [myapp]
appIdzcapacitor.config.ts.- Aktualizujte
versionvpackage.jsonpřed buildem. - Nahrajte ZIP na HTTPS server (GitHub Releases nebo vlastní hosting).
Odkaz na archiv se předává do CapacitorUpdater.download({ url, version }).
Po stažení downloadComplete zavolá CapacitorUpdater.set() – bundl se nahradí, aplikace se restartuje.
Integrace do aplikace
Úplný provider:
const AppUpdateProvider: FC<PropsWithChildren> = ({ children }) => {
CapacitorUpdater.notifyAppReady();
const dispatch = useAppDispatch();
const appRelease = useAppSelector(selectAppRelease);
// useEffect jako výše
return children;
};
V main.tsx obalte App:
root.render(
<Provider store={store({})}>
<AppUpdateProvider>
<App />
</AppUpdateProvider>
</Provider>
);
Co je důležité
- Aktualizace fungují pouze pro JS bundl, bez nativních pluginů.
- Bundl se archivuje přes
npx @capgo/cli bundle zip– jiné metody jsou nesprávné. - Volání
notifyAppReady()je povinné během prvních 10 sekund spuštění. - Porovnání verzí:
compare(currentVersion, newVersion, '<'). - Self-hosted Capgo – alternativa pro plnou kontrolu.
— Editorial Team
Zatím žádné komentáře.