Skip to content

feat(live-update): integrate Ionic Live Update Provider SDK#818

Open
robingenz wants to merge 4 commits intomainfrom
feat/live-update-ionic-provider
Open

feat(live-update): integrate Ionic Live Update Provider SDK#818
robingenz wants to merge 4 commits intomainfrom
feat/live-update-ionic-provider

Conversation

@robingenz
Copy link
Copy Markdown
Member

Summary

Adds optional integration with the Ionic Live Update Provider SDK so that @capawesome/capacitor-live-update can serve as a Capawesome provider for Federated Capacitor and Ionic Portals apps. The plugin registers itself with LiveUpdateProviderRegistry under the provider id capawesome whenever the optional native dependency is present.

The Ionic SDK is wired as an optional native dependency on every build system, so consumers who don't need it pay zero install footprint.

What's included

Optional native dependency wiring

  • Android (Gradle) — new capawesomeCapacitorLiveUpdateIncludeIonicProvider project property (default false). When true, io.ionic:liveupdateprovider is pulled in via implementation; otherwise it's compileOnly and never bundled into the consumer APK. A runtime Class.forName reflection check guards registration so the plugin never touches the SDK when it's absent.
  • iOS (CocoaPods) — new IonicProvider subspec on top of the new Default subspec. The IonicProvider subspec adds pod 'LiveUpdateProvider', '0.1.0-alpha.2' and sets OTHER_SWIFT_FLAGS = -DCAPAWESOME_INCLUDE_IONIC_PROVIDER to compile in the provider classes.
  • iOS (SPM) — bumped tools to 6.1 and added an IonicProvider package trait that conditionally pulls in the SDK and conditionally defines CAPAWESOME_INCLUDE_IONIC_PROVIDER. Requires Capacitor CLI 8.3.0+ and Xcode 16.3+.

Provider implementation

  • Android — new package providers/ionic/ with three Java classes:
    • LiveUpdateIonicProvider — implements the SDK's LiveUpdateProvider factory.
    • LiveUpdateIonicManager — implements LiveUpdateProviderManager, scoped per managerKey so multiple shells can persist their own state.
    • LiveUpdateIonicProviderRegistration — reflection-gated registration helper invoked from LiveUpdatePlugin.load().
  • iOS — new Providers/Ionic/ group with LiveUpdateIonicProvider.swift and LiveUpdateIonicManager.swift, both wrapped in #if CAPAWESOME_INCLUDE_IONIC_PROVIDER. Registration happens inline (also gated) in LiveUpdatePlugin.swift load().

Plumbing changes

  • LiveUpdate.{java,swift}: new public getBundleDirectory(bundleId) helper.
  • FetchLatestBundleOptions.{java,swift}: new optional per-call appId override so each manager can target a different Capawesome Cloud app without touching global preferences. fetchLatestBundleInternal (Java) / fetchLatestBundle (Swift) now honor it.
  • FetchLatestBundleResult.{java,swift}: getters added (the classes previously only exposed toJSObject).

State isolation

Provider-mode managers keep their own bundle pointer in a separate SharedPreferences file (Android) / UserDefaults key (iOS) namespaced by managerKey. They never touch the standalone plugin's currentBundleId / nextBundleId state, so standalone JS sync and provider mode can coexist without interfering.

Provider config (V1)

The provider's createManager(config) accepts a minimal map:

Key Type Required Notes
managerKey string Yes Scopes per-manager persisted state.
appId string No Falls back to plugin-wide appId from capacitor.config.json.
channel string No Falls back to plugin-wide defaultChannel.

All other settings come from the plugin-wide capacitor config. customId stays a global per-device value; consumers set it via the existing LiveUpdate.setCustomId({...}) JS API.

Documentation

  • New top-level "Ionic Live Update Provider SDK integration" section in the live-update README covering Android Gradle opt-in, iOS CocoaPods subspec, iOS SPM trait, the V1 config table, and FedCap + Portals usage snippets.
  • Two new feature bullets in the Features section (Ionic Portals support, Federated Capacitor support) with links to the upstream Ionic docs and SDK.

Deferred (follow-ups)

  • Bundle pruning in provider mode (deleteBundleIfUnused helper) — V1 leaks previous bundles to disk on each sync; matches the reference mock plugin behavior.
  • Per-manager overrides for serverDomain, publicKey, httpTimeout, etc.
  • ProGuard consumer-rules.pro (none needed yet — Android verify passed without them).

Test plan

  • npm run verify (iOS + Android + Web) passes locally in packages/live-update.
  • Smoke test in a real Federated Capacitor demo: configure liveUpdateConfig: { providerId: "capawesome", providerConfig: { managerKey, appId, channel } }, confirm LiveUpdateProviderRegistry.resolve("capawesome") returns the provider, trigger sync, and verify latestAppDirectory updates and FedCap loads the new bundle.
  • Smoke test in an Ionic Portals demo: instantiate the manager directly via the registry on iOS and Android, hand it to a Portal config, and confirm the bundle is served.
  • Confirm that opting out on Android (default) leaves io.ionic out of the consumer APK (./gradlew :app:dependencies).
  • Confirm that opting in on iOS via the new IonicProvider CocoaPods subspec compiles with -DCAPAWESOME_INCLUDE_IONIC_PROVIDER set and pulls in the LiveUpdateProvider pod.

Adds optional integration with the Ionic Live Update Provider SDK
(`io.ionic:liveupdateprovider` / `pod 'LiveUpdateProvider'`) so the
plugin can register itself as a Capawesome provider for Federated
Capacitor and Ionic Portals.

The SDK is an optional native dependency on both platforms:
- Android: `compileOnly` by default; opt in via the
  `capawesomeCapacitorLiveUpdateIncludeIonicProvider` Gradle property.
- iOS CocoaPods: new `IonicProvider` subspec adds the `LiveUpdateProvider`
  pod and the `CAPAWESOME_INCLUDE_IONIC_PROVIDER` compile flag.
- iOS SPM: new `IonicProvider` package trait wires the dependency and
  the same compile flag conditionally.

Provider mode keeps its own bundle pointer scoped by `managerKey` and
never touches the standalone `currentBundleId` / `nextBundleId` state.
Copilot AI review requested due to automatic review settings April 9, 2026 07:09
@pkg-pr-new
Copy link
Copy Markdown

pkg-pr-new bot commented Apr 9, 2026

Open in StackBlitz

@capawesome/capacitor-age-signals

npm i https://pkg.pr.new/capawesome-team/capacitor-plugins/@capawesome/capacitor-age-signals@818

@capawesome-team/capacitor-android-battery-optimization

npm i https://pkg.pr.new/capawesome-team/capacitor-plugins/@capawesome-team/capacitor-android-battery-optimization@818

@capawesome/capacitor-android-dark-mode-support

npm i https://pkg.pr.new/capawesome-team/capacitor-plugins/@capawesome/capacitor-android-dark-mode-support@818

@capawesome/capacitor-android-edge-to-edge-support

npm i https://pkg.pr.new/capawesome-team/capacitor-plugins/@capawesome/capacitor-android-edge-to-edge-support@818

@capawesome-team/capacitor-android-foreground-service

npm i https://pkg.pr.new/capawesome-team/capacitor-plugins/@capawesome-team/capacitor-android-foreground-service@818

@capawesome/capacitor-app-review

npm i https://pkg.pr.new/capawesome-team/capacitor-plugins/@capawesome/capacitor-app-review@818

@capawesome/capacitor-app-shortcuts

npm i https://pkg.pr.new/capawesome-team/capacitor-plugins/@capawesome/capacitor-app-shortcuts@818

@capawesome/capacitor-app-update

npm i https://pkg.pr.new/capawesome-team/capacitor-plugins/@capawesome/capacitor-app-update@818

@capawesome/capacitor-apple-sign-in

npm i https://pkg.pr.new/capawesome-team/capacitor-plugins/@capawesome/capacitor-apple-sign-in@818

@capawesome/capacitor-asset-manager

npm i https://pkg.pr.new/capawesome-team/capacitor-plugins/@capawesome/capacitor-asset-manager@818

@capawesome/capacitor-background-task

npm i https://pkg.pr.new/capawesome-team/capacitor-plugins/@capawesome/capacitor-background-task@818

@capawesome/capacitor-badge

npm i https://pkg.pr.new/capawesome-team/capacitor-plugins/@capawesome/capacitor-badge@818

@capawesome/capacitor-cloudinary

npm i https://pkg.pr.new/capawesome-team/capacitor-plugins/@capawesome/capacitor-cloudinary@818

@capawesome-team/capacitor-datetime-picker

npm i https://pkg.pr.new/capawesome-team/capacitor-plugins/@capawesome-team/capacitor-datetime-picker@818

@capawesome-team/capacitor-file-opener

npm i https://pkg.pr.new/capawesome-team/capacitor-plugins/@capawesome-team/capacitor-file-opener@818

@capawesome/capacitor-file-picker

npm i https://pkg.pr.new/capawesome-team/capacitor-plugins/@capawesome/capacitor-file-picker@818

@capawesome/capacitor-google-sign-in

npm i https://pkg.pr.new/capawesome-team/capacitor-plugins/@capawesome/capacitor-google-sign-in@818

@capawesome/capacitor-libsql

npm i https://pkg.pr.new/capawesome-team/capacitor-plugins/@capawesome/capacitor-libsql@818

@capawesome/capacitor-live-update

npm i https://pkg.pr.new/capawesome-team/capacitor-plugins/@capawesome/capacitor-live-update@818

@capawesome/capacitor-managed-configurations

npm i https://pkg.pr.new/capawesome-team/capacitor-plugins/@capawesome/capacitor-managed-configurations@818

@capawesome/capacitor-photo-editor

npm i https://pkg.pr.new/capawesome-team/capacitor-plugins/@capawesome/capacitor-photo-editor@818

@capawesome/capacitor-pixlive

npm i https://pkg.pr.new/capawesome-team/capacitor-plugins/@capawesome/capacitor-pixlive@818

@capawesome/capacitor-posthog

npm i https://pkg.pr.new/capawesome-team/capacitor-plugins/@capawesome/capacitor-posthog@818

@capawesome/capacitor-realtimekit

npm i https://pkg.pr.new/capawesome-team/capacitor-plugins/@capawesome/capacitor-realtimekit@818

@capawesome/capacitor-screen-orientation

npm i https://pkg.pr.new/capawesome-team/capacitor-plugins/@capawesome/capacitor-screen-orientation@818

@capawesome/capacitor-screenshot

npm i https://pkg.pr.new/capawesome-team/capacitor-plugins/@capawesome/capacitor-screenshot@818

@capawesome/capacitor-square-mobile-payments

npm i https://pkg.pr.new/capawesome-team/capacitor-plugins/@capawesome/capacitor-square-mobile-payments@818

@capawesome/capacitor-superwall

npm i https://pkg.pr.new/capawesome-team/capacitor-plugins/@capawesome/capacitor-superwall@818

@capawesome/capacitor-torch

npm i https://pkg.pr.new/capawesome-team/capacitor-plugins/@capawesome/capacitor-torch@818

commit: 59e83ba

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds optional integration with the Ionic Live Update Provider SDK so @capawesome/capacitor-live-update can act as a Capawesome provider (providerId = "capawesome") for Federated Capacitor and Ionic Portals, while keeping the SDK out of builds unless explicitly enabled.

Changes:

  • Adds optional Ionic Provider SDK wiring for Android (Gradle flag), iOS (CocoaPods subspec + SPM trait), and registers the provider on plugin load.
  • Implements provider + manager on Android and iOS, including managerKey-scoped persisted “latest bundle” pointers isolated from the standalone plugin state.
  • Adds per-call appId override plumbing and additional getters for fetch results.

Reviewed changes

Copilot reviewed 19 out of 19 changed files in this pull request and generated 7 comments.

Show a summary per file
File Description
packages/live-update/README.md Documents opt-in steps + provider config/usage for Portals and Federated Capacitor.
packages/live-update/Package.swift Adds SPM trait, conditional product dependency, and compile define for provider build.
packages/live-update/ios/Plugin/Providers/Ionic/LiveUpdateIonicProvider.swift iOS provider wrapper (trait-gated).
packages/live-update/ios/Plugin/Providers/Ionic/LiveUpdateIonicManager.swift iOS manager implementation + managerKey-scoped persistence (trait-gated).
packages/live-update/ios/Plugin/LiveUpdatePlugin.swift Registers the provider with LiveUpdateProviderRegistry when enabled.
packages/live-update/ios/Plugin/LiveUpdate.swift Adds bundle-directory helper and supports per-call appId override for latest-bundle fetch.
packages/live-update/ios/Plugin/Classes/Results/FetchLatestBundleResult.swift Adds getters for provider/manager usage.
packages/live-update/ios/Plugin/Classes/Options/FetchLatestBundleOptions.swift Adds optional per-call appId.
packages/live-update/ios/Plugin.xcodeproj/project.pbxproj Adds new provider source files to the Xcode project.
packages/live-update/CapawesomeCapacitorLiveUpdate.podspec Introduces Default + IonicProvider subspecs with a Swift compile flag.
packages/live-update/android/src/main/java/.../providers/ionic/LiveUpdateIonicProviderRegistration.java Android registration helper for the optional SDK.
packages/live-update/android/src/main/java/.../providers/ionic/LiveUpdateIonicProvider.java Android provider implementation.
packages/live-update/android/src/main/java/.../providers/ionic/LiveUpdateIonicManager.java Android manager implementation + managerKey-scoped persistence.
packages/live-update/android/src/main/java/.../LiveUpdatePlugin.java Hooks registration into plugin load.
packages/live-update/android/src/main/java/.../LiveUpdate.java Adds bundle-directory helper and supports per-call appId override for latest-bundle fetch.
packages/live-update/android/src/main/java/.../classes/results/FetchLatestBundleResult.java Adds getters for provider/manager usage.
packages/live-update/android/src/main/java/.../classes/options/FetchLatestBundleOptions.java Adds optional per-call appId.
packages/live-update/android/build.gradle Adds optional dependency wiring (implementation vs compileOnly) controlled by a Gradle property.
.changeset/tall-doors-clean.md Declares a minor version bump for the package.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread packages/live-update/README.md
Comment thread packages/live-update/ios/Plugin/LiveUpdate.swift
Comment thread packages/live-update/ios/Plugin/Providers/Ionic/LiveUpdateIonicManager.swift Outdated
Adds a new sibling example app under `packages/live-update/example-ionic-portals`
that exercises the Ionic Live Update Provider SDK integration end-to-end without
requiring a real Federated Capacitor or Portals host.

The app opts into the integration on both platforms:
- Android: `capawesomeCapacitorLiveUpdateIncludeIonicProvider = true` in
  `variables.gradle`.
- iOS: `pod 'CapawesomeCapacitorLiveUpdate/IonicProvider'` in the Podfile.

It ships a small custom Capacitor plugin (`IonicProviderTest`) implemented
natively in Java and Swift that exposes the SDK to JavaScript:
- `isProviderRegistered()` — confirms the provider is in
  `LiveUpdateProviderRegistry`.
- `getLatestAppDirectory({ managerKey, appId?, channel? })` — constructs a
  manager and returns its restored `latestAppDirectory` without syncing.
- `syncManager({ managerKey, appId?, channel? })` — full sync; returns the
  new `latestAppDirectory` and any `FederatedCapacitorSyncResult.metadata`.

The web UI provides input fields for the per-manager config plus three
buttons backed by these methods, with a log pane for results.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants