Local Resources

Bundle images, videos, and other assets in your app so paywalls can load them instantly from the device.

Local resources let your paywalls load bundled assets directly from the device instead of fetching them over the network. This is useful for hero images, onboarding videos, and other media that should appear immediately even when the connection is slow.

Local resources require Android SDK v2.7.7+.

Registering local resources

Choose a stable resource ID for each asset you want to serve locally. That same ID is what you'll select in the paywall editor when configuring image or video components.

On Android, local resources are configured on Superwall.instance.localResources after calling configure(), and before presenting paywalls that depend on those assets.

import android.app.Application
import android.net.Uri
import com.superwall.sdk.Superwall
import com.superwall.sdk.paywall.view.webview.PaywallResource
import java.io.File

class MyApplication : Application() {
  override fun onCreate() {
    super.onCreate()

    Superwall.configure(
      application = this,
      apiKey = "pk_your_api_key",
    )

    Superwall.instance.localResources = mapOf(
      "hero-image" to PaywallResource.FromResources(R.drawable.hero),
      "onboarding-video" to PaywallResource.FromUri(
        Uri.fromFile(File(filesDir, "welcome.mp4"))
      ),
      "background-animation" to PaywallResource.FromResources(R.raw.paywall_bg)
    )
  }
}

Set localResources before presenting paywalls that depend on those assets. Updating the map later only affects paywalls loaded after the change.

Supported source types

Android supports two local resource source types:

TypeUse for
PaywallResource.FromResources(resId)Assets packaged in res/drawable, res/raw, and other Android resource folders
PaywallResource.FromUri(uri)Files addressed by a Uri, such as files in app storage or content provider URLs

Choosing resource IDs

Resource IDs are the contract between your app and the paywall editor. A few guidelines:

  • Use stable, descriptive names like "hero-image" and "onboarding-video".
  • Keep the casing consistent. "Hero-Image" and "hero-image" are different IDs.
  • If you rename an ID, update any paywalls that reference it.

Referencing local resources in a paywall

In the paywall editor, set a local resource on an image or video component and select the resource ID you registered in the SDK. You can still provide a remote URL as a fallback.

Under the hood, paywalls load these resources through swlocal:// URLs. For example:

<video src="swlocal://onboarding-video" autoplay muted playsinline></video>

If the SDK cannot resolve a local resource, the paywall can fall back to the remote URL configured in the editor.

Debugging

If a resource ID does not appear in the editor or fails to load:

  • Make sure the app is running a compatible SDK version.
  • Confirm the resource ID in your paywall exactly matches the key you registered in the SDK.
  • Open a paywall on a test device after configuring local resources so the editor can discover recently used IDs.
  • Keep a remote fallback URL on critical media so older builds still render correctly.

How is this guide?

On this page