Offline Download Manager

Download and display offline media files within your app

The Offline Download Manager plugin lets your app download and manage document and media files directly on the device. Users can access downloaded files without a network connection, and you can track download progress and manage files through a built-in interface or programmatically through the JavaScript bridge.

👍

Developer Demo

Display our demo page in your app to test during development https://median.dev/offline-download-manager/

Why use Offline Download Manager

Offline access removes dependency on network connectivity for content-heavy apps. Instead of streaming or re-fetching files on every visit, downloaded content is available instantly, even in airplane mode.

  • Document and media apps: Let users download articles, PDFs, audio, or video for offline reading or playback.
  • Field service apps: Ensure technicians can access manuals and forms when working in areas with no connectivity.
  • Training and education apps: Allow learners to download course materials before a commute or travel.
  • Content subscription apps: Enable subscribers to save content locally for offline consumption.

Implementation Guide

JavaScript bridge functions

Use the following JavaScript bridge functions to initialize the download manager, start downloads, and display the file management UI.

Initialization

Create a JavaScript function to receive status events, e.g.

function downloadCallback(data) {
  console.log(data);
}

Before starting any downloads, you will need to register your callback by running the following command using the Median JavaScript Bridge through HTML or JavaScript:

{/* Note: This command returns a promise */}
<button onclick="median.downloads.init({'callback': downloadCallback})">
  Register Download Callback
</button>
median.downloads.init({ callback: downloadCallback }); // returns promise

Starting Downloads

To start a download, run the following command using the Median JavaScript Bridge:

<button
  onclick="median.downloads.downloadFile({'url': 'URL', 'title': 'Title'})"
>
  Start Download
</button>
median.downloads.downloadFile({ url: "URL", title: "Title" });

Params "url" and "title" are required, all others are optional.
Supported parameters are:

  • url: The URL of the file to download. Should start with http or https.
  • title: The name to show in the UI.
  • identifier (optional): a string used to identify the download in the downloadCallback function, so that multiple simultaneous downloads can be differentiated.
  • details (optional): additional information to show below the title. A description of the download.
  • date (optional): a date in yyyy-mm-dd format to show below the details. Can be used to show a publish date for a podcast, for example.

Following the Download progress

After a download is started, the callback function will be called with a data object with the following fields:

  • identifier: the identifier passed to the downloadFile command
  • event: "progress", "done", or "error"

If event is "progress":

  • bytesWritten: the number of bytes that have been downloaded
  • expectedBytes: the file sized indicated by the server

If event is "error":

  • errorMessage: A string indicating the reason for the error

Showing UI

To show the download manager user interface, run the following command using the Median JavaScript Bridge:

<button onclick="median.downloads.showUI()">Show Download Manager UI</button>
median.downloads.showUI();

Offline Page

Typically your app will cache the pages for display offline. To ensure the download manager UI can still be opened when the app if offline for an extended period configure an offline.html page within your app. See Offline Page and review the sample offline page below or on Codepen.

Troubleshooting

Offline Download Manager functions are undefined or not working

Ensure the JavaScript Bridge is enabled in Median App Studio. Define a median_library_ready() function on your page — Median calls it after the bridge has initialized. If the bridge may already be initialized before your function is defined, use the fallback check:

function median_library_ready() {
  // safe to call median.downloads functions here
}

// fallback if bridge initialized before page loaded
if (window.median) {
  median_library_ready();
}

Also verify that median.downloads.init is called before median.downloads.downloadFile. See the JavaScript Bridge Overview for details.

Callback does not receive events after downloadFile is called

Confirm that median.downloads.init was called with a valid callback before downloadFile. The callback must be registered before any download is started. Check the browser console for JavaScript errors in your callback function.

Download manager UI is not accessible when offline

Configure an offline.html page in your app to ensure the download manager remains accessible when there is no network connectivity. Without this configuration, the download manager UI may not load when the device is offline. See Offline Page configuration for setup instructions — note that all CSS/JS must be inlined and images must be Base64 or SVG.

Offline Download Manager Demo App

📘

Demo App - Note

In the sample applications below, you can explore how document and media files are downloaded, along with the callback responses that occur during the download process. Additionally, these apps demonstrate the functionality of the offline file manager. For a complete offline experience, we recommend downloading the Android app and switching to Airplane mode after downloading at least one file.

iOSAndroid

Next Steps