pushpushgo_sdk 1.4.1 copy "pushpushgo_sdk: ^1.4.1" to clipboard
pushpushgo_sdk: ^1.4.1 copied to clipboard

PushPushGo SDK for Flutter

0.0.1 #

WIP Release - iOS and Android support based on our native SDK

0.0.2 #

Android switch to version 2.0.1 to fix beacon tags format Fix beacons (tags, selectors) passing to server

0.0.3 #

Add readme md with instructions Cleanup example code

0.0.4 #

Change link to repository in to pubspec

0.0.5 #

Change description in pubspec

0.0.6 #

iOS now support strategy and ttl in tags ios-sdk set to 1.2.0

0.0.7 #

Update android-sdk to 2.0.2 version Fix issue with "crashing app" on initial run

0.0.8 #

VERSION REDACTED

0.0.9 #

Update android-sdk to 2.0.6 version Fix issue with "crashing app" on background run

1.0.1 #

Update ios-sdk to 2.0.1 version Fix issue with delivered events on ios apps Breaking changes: requires AppGroups capability on ios App target

1.0.2 #

Fix ios sdk versioning

1.0.3 #

Add PPG.registerNotificationsDeliveredFromUserInfo() into PushPushGoSdkPlugin.swift

1.0.4 #

Pre release test version for fixing delivery events on app killed

1.1.0 #

Fix async completion handler issue in PPG.registerNotificationsDeliveredFromUserInfo() Fix delivered event issue

1.2.0 #

Add support for Swift Package Manager (SPM) Add support for push notification buttons Fix error for channeling methods not from main thread

1.2.1 #

Fix support of cocoapods (change path to plugin, change podfile version)

1.2.2 #

Cocoapods supported for ios from version 3.0.3 Add Universal Links support

1.2.3 #

Update android and firebase libraries Fix sdk namespace problem

1.2.4-beta.1 #

Add onNotificationClicked event handler Example Android app migration to new version

1.2.4-beta.2 #

Add handleNotificationLink option to control automatic URL opening on notification click Update Android SDK to 3.0.2

1.3.0 #

New Features #

  • In-App Messages - Display targeted messages within your app based on routes or custom triggers
    • Route-based message triggering with InAppMessagesNavigatorObserver
    • Custom event triggers via showMessagesOnTrigger()
    • Custom code action handlers for button clicks
    • Support for multiple routers (Navigator, go_router, auto_route, Beamer)
    • Separate documentation in IN_APP_MESSAGES.md
  • Notification Click Handler - Handle push notification clicks directly in Flutter
    • New onNotificationClickedHandler callback in initialize() method
    • New handleNotificationLink option to control automatic URL opening
    • Access to notification payload (link, campaign, project)

Improvements #

  • iOS: Fix cold start notification handling with pendingNotificationData mechanism
  • Updated documentation with In-App Messages guide and notification handler examples
  • Update PPG Android SDK to 3.0.2
  • Update PPG In-App Messages SDK to 3.0.2

1.3.1 #

Bug Fixes #

  • Android: Fix cold-start crash - Added PushPushGoContentProvider for early SDK initialization
    • Prevents PushPushException: You have to initialize PushPushGo with context first! on first app install
    • SDK now initializes via ContentProvider before FCM can trigger onNewToken()
    • Supports credentials from AndroidManifest meta-data or SharedPreferences

1.3.2 #

New Features #

  • Dynamic Groups (Segments) - Assign/unassign subscribers to dynamic groups via Beacon
    • New assignToGroup property in Beacon for assigning subscribers to dynamic groups
    • New unassignFromGroup property in Beacon for unassigning subscribers from dynamic groups
    • Requires ios-sdk 4.2.0+ and android-sdk 3.1.0+

1.3.3 #

Bug Fixes #

  • Android: Fix release build crash (R8/ProGuard) - Added consumer ProGuard rules for Huawei HMS classes
    • Fixes Missing class com.huawei.agconnect.AGConnectOptions and related R8 errors during release build
    • Apps using only GMS (without HMS) no longer fail on minifyReleaseWithR8

1.3.4 #

Bug Fixes #

  • Android: Fix in-app messages not displaying - Fixed currentActivity being null in InAppUIController when SDK is initialized from Dart (after the first Activity.onResume). The SDK registers ActivityLifecycleCallbacks too late to capture the initial resume, so the current activity is now injected directly via reflection at initialization time and before each trigger/route change.
  • Android: Fix Kotlin 2.x compilation error - Fixed onSuccess signature in PushpushgoSdkPlugin to match updated interface definition

1.3.5 #

Bug Fixes #

  • Android: Fix missing click events when handleNotificationLink: false - Notification click tracking (handleBackgroundNotificationClick) was incorrectly gated by the handleNotificationLink flag in PushPushGoHelpers.onCreate/onNewIntent, so apps that opted out of native link opening to handle deeplinks themselves stopped reporting click events to PPG entirely. Click tracking is now always invoked; the handleNotificationLink flag continues to control only whether the native SDK opens the URL (via the no-op notificationHandler override).
  • Android: Apply notificationHandler override in early init paths - The no-op handler is now also applied from PushPushGoContentProvider and PushPushGoHelpers.initialize based on the persisted flag, so link opening stays suppressed even on cold-starts triggered by a notification click before the Flutter side initializes.

1.3.6 #

Bug Fixes #

  • Android: Fix cold-start crash on FCM callbacks (PushPushException: You have to initialize PushPushGo with context first!) - Bumped native android-sdk from 3.1.0 to 3.2.0. In 3.1.0 the internal logDebug() called PushPushGo.getInstance() without an initialization guard, so any FCM callback (onNewToken/onMessageReceived) arriving before SDK initialization crashed the app before the isInitialized() check could run - typically on the first launch after a fresh install, when SharedPreferences are still empty and AndroidManifest meta-data credentials are not configured. FCM callbacks arriving before initialization are now safely ignored. Configuring the AndroidManifest meta-data is still recommended so that pushes received on cold start are actually displayed.

1.3.7 #

Bug Fixes #

  • iOS: Fix notification click not delivered on cold start - The UNUserNotificationCenter delegate was registered only during initialize() (called from Dart after the Flutter engine starts), which is after the app finishes launching - too late for iOS to reliably deliver the tap that launched the app. As a result, onNotificationClickedHandler (and native link opening) did not fire when the app was fully closed. The delegate is now registered at plugin registration time (during didFinishLaunching), and a tap that arrives before initialize() completes is cached natively and replayed right after initialization.

1.4.0 #

Features #

  • Live Activities - Real-time, backend-driven notifications on both platforms: Android 16 Live Updates (ProgressStyle) and iOS Live Activities on the Lock Screen and Dynamic Island, with the FOOTBALL_MATCH_TRACKING template. New PPGLiveActivities API: initialize, isSupported, subscribe, unsubscribe, getSubscriberId, isActive, getActiveActivities, simulatePush, plus a statusStream of lifecycle events and setClickHandler for taps. See Live Activities Guide.
  • Android: No host-app code required - The plugin intercepts Live Activity clicks on both cold start and onNewIntent, so unlike the native SDK integration nothing has to be added to MainActivity. Clicks arriving before the Flutter engine is ready are buffered and replayed. Deep link opening follows the existing handleNotificationLink flag.
  • iOS: Widget Extension integration - Live Activities are rendered by a Widget Extension in the host app, using the Lock Screen and Dynamic Island views shipped by the native SDK. The plugin reuses the App Group and credentials already configured for push notifications, handles late-join bootstrap (subscribing to an already running activity), and prefetches team badges into the App Group. Taps arrive as SDK-owned ppg-la:// URLs: the plugin consumes them to report the click to Dart (live notification id, deep link and action button index) and lets the native SDK forward the tap to its real destination — http(s) to the browser, a custom scheme back to the app so your own routing sees it, ppg-la://close to end the activity. URLs that are not ppg-la:// are left untouched, so universal links and other deep-link plugins are unaffected. A complete working example was added in example/ios/LiveActivityWidget.

Bug Fixes #

  • Live Activity clicks are no longer lost on cold start - A tap that launches the app is delivered by the native side as soon as the event channel opens, which is typically before the app registers its click handler (any widget touching statusStream opens the channel first). Those clicks were dropped. They are now buffered on the Dart side and replayed the moment setClickHandler is called, so handler registration order no longer matters. Status events published before the first statusStream listener attaches are replayed the same way.
  • iOS: correct click payload - liveNotificationId was empty for every tap except CLOSE buttons, and deepLink carried the SDK-internal ppg-la://click?… wrapper instead of the real destination. Both are now read from the wrapper, and actionIndex reports the tapped action button (0 / 1) instead of always -1, matching Android.
  • iOS: no more spurious clicks - Any URL opened while a Live Activity was on screen (universal links, OAuth callbacks, other plugins' deep links) was reported as a Live Activity tap. Only the SDK-owned ppg-la:// scheme is inspected now.
  • Android: isSupported() no longer depends on SDK initialization - It returned false on a supported Android 16+ device whenever PushpushgoSdk.initialize() had not completed, conflating "not initialized" with "unsupported device". It now falls back to the OS version check.
  • Android: invalid credentials no longer brick the app - PushPushGo.getInstance() only validates while it builds its singleton, so credentials passed to a later initialize() were accepted unchecked and written to SharedPreferences. The next cold start rebuilt the SDK from those values, threw during validation inside PushPushGoHelpers.initialize(), and killed Application.onCreate — an unrecoverable crash loop until the user cleared app data. Credentials are now validated before they are stored (initialize() fails with INVALID_CREDENTIALS instead), and startup initialization no longer throws: unusable stored credentials are logged, dropped and the app starts normally.
  • CocoaPods: a missing :git source now fails instead of silently downgrading - The podspec depended on PPG_framework / PPG_InAppMessages without a version floor. The 4.x native SDK is served from GitHub, but the CocoaPods trunk still carries PPG_framework 3.0.3 (June 2025), so an app that forgot the :git/:tag line in its Podfile resolved that copy and quietly built against a native SDK four minor versions behind. Both dependencies now require ~> 4.3, so CocoaPods reports None of your spec sources contain a spec satisfying the dependency instead. The README also spells out that both pods are required, even for push-only apps.

Dependencies #

  • iOS: native ios-sdk 4.2.0 → 4.4.0 (adds the PPG_LiveActivities product), linked through Swift Package Manager. On CocoaPods, apps opt in by adding pod 'PPG_LiveActivities', :git => 'https://github.com/ppgco/ios-sdk.git', :tag => '4.4.0' to their own Podfile; the plugin cannot declare the dependency itself, because the pod is not on the CocoaPods trunk and doing so would break pod install for apps that never use Live Activities. The plugin builds and runs with or without the module; without it, Live Activities report as unsupported.
  • Android: no change - native android-sdk 3.2.0 already ships Live Activities.

1.4.1 #

Build & Compatibility #

  • Android: the plugin now configures under Android Gradle Plugin 9.x - Two independent hard errors stopped an app on AGP 9 from configuring at all. AGP 9 brings its own Kotlin support, so apply plugin: 'kotlin-android' is rejected outright (The 'org.jetbrains.kotlin.android' plugin is no longer required for Kotlin support since AGP 9.0); and AGP 9's DSL dropped the compileSdkVersion setter, so compileSdkVersion 35 left the project with no compileSdk at all. The Kotlin plugin is now applied only when AGP's built-in Kotlin is not in play (AGP 8.x, or AGP 9.x with android.builtInKotlin=false), compileSdk uses the property form, and kotlinOptions moved to the top-level kotlin.compilerOptions block that both KGP and built-in Kotlin understand. Verified against AGP 9.4.0/Gradle 9.6.1 and AGP 8.6.0/Gradle 8.13 from the same file - no change is required in host apps.
  • Android: dead Android Gradle Plugin pin removed - The plugin declared classpath 'com.android.tools.build:gradle:8.7.0' in its own buildscript. The host app's AGP always wins, so the pin protected nothing and only misled anyone reading the build file. The Kotlin Gradle plugin classpath is deliberately kept: it is what lets the plugin build inside host apps that do not declare KGP themselves.
  • Android: allprojects { repositories { … } } replaced with a plain repositories block - Identical behaviour (the block only ever applied to the plugin's own project), minus the conflict with Gradle's Isolated Projects. JitPack still resolves in host apps that do not declare it.
  • Android: minimum supported AGP documented as 8.2.2 - Required by the bundled Kotlin Gradle plugin. This floor already existed; it was simply never written down. See the Requirements table in the README, which now also covers Gradle, JDK, compileSdk, minSdk and targetSdk.
  • Example app: compileSdk and targetSdk pinned to 36 - Previously inherited from flutter.compileSdkVersion / flutter.targetSdkVersion, which still resolve to 35. Google Play has required API 36 for new apps and updates since 31 Aug 2026, so the example was demonstrating a configuration Play no longer accepts.
  • Example app: Gradle 9 preparation - rootProject.buildDir (removed in Gradle 9) replaced with layout.buildDirectory, and the deprecated Groovy space-assignment syntax replaced with explicit assignments across the example and plugin build files. The example's Gradle wrapper stays on 8.13 for now: Flutter 3.32's own Gradle plugin does not compile under Gradle 9.

Dependencies #

  • Android: native android-sdk 3.2.0 → 3.2.1 - Picks up a longer timeout and added diagnostics for notification image processing. The public API only gains two nullable LiveActivity fields, so nothing changes on the Dart side.
  • Android: Firebase consolidated onto BOM 34.7.0 - The plugin declared both firebase-bom:33.16.0 and an explicit firebase-messaging-ktx:24.1.2; the explicit version silently won, making the BOM inert, and the -ktx artifacts have been merged into their base artifacts since BOM 33.x. Now a single BOM drives firebase-messaging (25.0.1). Verified not to raise the compileSdk or minSdk an app needs.
  • Android: Guava 31.1 → 33.7.1-android - Still required for the ListenableFuture the native 3.x API returns.
  • flutter_lints 2.0.0 → 6.0.0 (dev dependency only; flutter analyze stays clean).

Internal #

  • CI publishes from Flutter 3.32.4 instead of 3.7.12 - The release workflow ran flutter analyze on an SDK from April 2023, so the gate never saw what integrators see.
  • Example: fixed example/pubspec.yaml Dart constraint - <3.0.0 only resolved thanks to pub's leniency for pre-Dart-3 upper bounds; it now matches the plugin's own <4.0.0.
  • Android: the Kotlin sources now compile without warnings - optString(name, null) passed null into a parameter the platform declares non-null (it worked only because the method never checks); the beacon's assignToGroup / unassignFromGroup now use has() plus the single-argument overload, with identical behaviour. The untyped Bundle.get(key) used to enumerate a push payload is now explicitly suppressed and explained, rather than left as a bare deprecation.
  • Example and README: MainApplication extends android.app.Application - io.flutter.app.FlutterApplication is deprecated and no longer needed with the current Flutter embedding. The README's integration snippet told integrators to extend it, so every host app inherited the warning too.