1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.
  2. Anuncie Aqui
    Anuncie aqui você Também: fdantas@4each.com.br

Angular + Capacitor Android app updates via custom zip source work only until app is killed

Discussão em 'Angular' iniciado por Mike, Maio 30, 2025.

  1. Mike

    Mike Guest

    I'm developing an Android app using Angular + Capacitor. I implemented a custom update mechanism that downloads a .zip file from my server, extracts it to a custom folder inside FilesystemDirectory.Data, and then sets the base path using WebView.setServerBasePath.

    Everything works great after the update:

    The app downloads and extracts the zip successfully.

    The new version is shown after window.location.reload().

    I store the extracted path and version using @capacitor/storage.

    However, after the app is killed or swiped away from memory, the app launches with the old version (the one from www/, not from custom_www/).

    Here is what I do in main.ts before platformBrowserDynamic():

    const STORAGE_KEY = 'customBasePathSet';
    let customWebDirPath: any = null;

    const setCustomBasePath = async (): Promise<void> => {

    const platform = Capacitor.getPlatform();
    const isAlreadyInCustomPath = await Storage.get({ key: STORAGE_KEY });


    if (platform !== 'web' && isAlreadyInCustomPath.value !== 'true') {
    try {

    customWebDirPath = await Storage.get({ key: 'customBasePath' });

    alert(`customWebDirPath: ${customWebDirPath.value}`)

    await Filesystem.stat({
    directory: Directory.Data,
    path: `${customWebDirPath.value}/index.html`,
    });

    const uri = await Filesystem.getUri({
    directory: Directory.Data,
    path: customWebDirPath.value,
    });

    const absolutePath = uri.uri.replace('file://', '');

    await WebView.setServerBasePath({ path: absolutePath });

    await Storage.set({ key: STORAGE_KEY, value: 'true' });


    } catch (err) {
    alert('catch')
    console.warn('⚠️ Could not set custom base path. Error:', err);
    }
    } else {
    const currentBasePath = await WebView.getServerBasePath();
    }
    };


    and app.component.ts (only unzip function)

    this.zip.unzip(zipFilePath, unpackDirPath, async (status: any) => {
    if (status === 0) {
    alert(' Unzipped successfully!');

    try {
    // Удаляем предыдущую custom_www директорию, если существует
    try {
    await Filesystem.rmdir({
    directory: Directory.Data,
    path: customWebDirPath,
    recursive: true
    });
    } catch (e) {
    // log error
    }

    // copu to custom_www
    await this.copyFolder(unpackPath, customWebDirPath);

    // get absolute path custom_www
    const webDirUri = await Filesystem.getUri({
    directory: Directory.Data,
    path: customWebDirPath
    });
    const absoluteWebDirPath = webDirUri.uri.replace('file://', '');

    // set
    await WebView.setServerBasePath({ path: absoluteWebDirPath });

    // save custom path to the storage
    await Storage.set({ key: 'customBasePath', value: absoluteWebDirPath });
    await Storage.set({ key: 'app_version', value: version });

    alert(`✅ Set new base path: ${absoluteWebDirPath}`);


    // restart app
    window.location.reload();

    } catch (e) {
    console.error('❌ Error copying files:', e);
    }
    } else {
    console.warn('❌ Failed to unzip update');
    }
    });
    ```

    after update my app shows correct version all good. but after restart(close from memory) it loads start version.

    It seems that WebView.setServerBasePath() does not persist across app restarts.

    Question:
    How can I make Capacitor/Angular app consistently load from the updated custom_www folder (inside FilesystemDirectory.Data) even after the app is killed and restarted?

    Continue reading...

Compartilhe esta Página