Zpět na domů

Manuální aktualizace Capacitor bundlů bez obchodů

Článek popisuje manuální integraci @capgo/capacitor-updater pro OTA-aktualizace JS-bundlů Capacitor aplikací. Uvedeny příklady kódu provideru, příprava archivů prostřednictvím CLI, kontrola souladu s pravidly obchodů. Vhodné pro middle/senior vývojáře.

Capacitor: aktualizace bundlů mimo schválení obchodů
Advertisement 728x90

# 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 AdInline article slot
  • 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:

Google AdInline article slot
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.

Google AdInline article slot

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]
  • appId z capacitor.config.ts.
  • Aktualizujte version v package.json př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

Advertisement 728x90

Číst dál