pushpushgo_sdk 1.4.1
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
- Route-based message triggering with
- Notification Click Handler - Handle push notification clicks directly in Flutter
- New
onNotificationClickedHandlercallback ininitialize()method - New
handleNotificationLinkoption to control automatic URL opening - Access to notification payload (link, campaign, project)
- New
Improvements #
- iOS: Fix cold start notification handling with
pendingNotificationDatamechanism - 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
PushPushGoContentProviderfor 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
- Prevents
1.3.2 #
New Features #
- Dynamic Groups (Segments) - Assign/unassign subscribers to dynamic groups via Beacon
- New
assignToGroupproperty in Beacon for assigning subscribers to dynamic groups - New
unassignFromGroupproperty in Beacon for unassigning subscribers from dynamic groups - Requires ios-sdk 4.2.0+ and android-sdk 3.1.0+
- New
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.AGConnectOptionsand related R8 errors during release build - Apps using only GMS (without HMS) no longer fail on
minifyReleaseWithR8
- Fixes
1.3.4 #
Bug Fixes #
- Android: Fix in-app messages not displaying - Fixed
currentActivitybeing null inInAppUIControllerwhen SDK is initialized from Dart (after the firstActivity.onResume). The SDK registersActivityLifecycleCallbackstoo 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
onSuccesssignature inPushpushgoSdkPluginto 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 thehandleNotificationLinkflag inPushPushGoHelpers.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; thehandleNotificationLinkflag continues to control only whether the native SDK opens the URL (via the no-opnotificationHandleroverride). - Android: Apply
notificationHandleroverride in early init paths - The no-op handler is now also applied fromPushPushGoContentProviderandPushPushGoHelpers.initializebased 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 internallogDebug()calledPushPushGo.getInstance()without an initialization guard, so any FCM callback (onNewToken/onMessageReceived) arriving before SDK initialization crashed the app before theisInitialized()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
UNUserNotificationCenterdelegate was registered only duringinitialize()(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 (duringdidFinishLaunching), and a tap that arrives beforeinitialize()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 theFOOTBALL_MATCH_TRACKINGtemplate. NewPPGLiveActivitiesAPI:initialize,isSupported,subscribe,unsubscribe,getSubscriberId,isActive,getActiveActivities,simulatePush, plus astatusStreamof lifecycle events andsetClickHandlerfor 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 toMainActivity. Clicks arriving before the Flutter engine is ready are buffered and replayed. Deep link opening follows the existinghandleNotificationLinkflag. - 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://closeto end the activity. URLs that are notppg-la://are left untouched, so universal links and other deep-link plugins are unaffected. A complete working example was added inexample/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
statusStreamopens the channel first). Those clicks were dropped. They are now buffered on the Dart side and replayed the momentsetClickHandleris called, so handler registration order no longer matters. Status events published before the firststatusStreamlistener attaches are replayed the same way. - iOS: correct click payload -
liveNotificationIdwas empty for every tap exceptCLOSEbuttons, anddeepLinkcarried the SDK-internalppg-la://click?…wrapper instead of the real destination. Both are now read from the wrapper, andactionIndexreports 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 returnedfalseon a supported Android 16+ device wheneverPushpushgoSdk.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 laterinitialize()were accepted unchecked and written to SharedPreferences. The next cold start rebuilt the SDK from those values, threw during validation insidePushPushGoHelpers.initialize(), and killedApplication.onCreate— an unrecoverable crash loop until the user cleared app data. Credentials are now validated before they are stored (initialize()fails withINVALID_CREDENTIALSinstead), and startup initialization no longer throws: unusable stored credentials are logged, dropped and the app starts normally. - CocoaPods: a missing
:gitsource now fails instead of silently downgrading - The podspec depended onPPG_framework/PPG_InAppMessageswithout a version floor. The 4.x native SDK is served from GitHub, but the CocoaPods trunk still carriesPPG_framework 3.0.3(June 2025), so an app that forgot the:git/:tagline in itsPodfileresolved that copy and quietly built against a native SDK four minor versions behind. Both dependencies now require~> 4.3, so CocoaPods reportsNone of your spec sources contain a spec satisfying the dependencyinstead. 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_LiveActivitiesproduct), linked through Swift Package Manager. On CocoaPods, apps opt in by addingpod 'PPG_LiveActivities', :git => 'https://github.com/ppgco/ios-sdk.git', :tag => '4.4.0'to their ownPodfile; the plugin cannot declare the dependency itself, because the pod is not on the CocoaPods trunk and doing so would breakpod installfor 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 thecompileSdkVersionsetter, socompileSdkVersion 35left the project with nocompileSdkat 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 withandroid.builtInKotlin=false),compileSdkuses the property form, andkotlinOptionsmoved to the top-levelkotlin.compilerOptionsblock 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 ownbuildscript. 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 plainrepositoriesblock - 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,minSdkandtargetSdk. - Example app:
compileSdkandtargetSdkpinned to 36 - Previously inherited fromflutter.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 withlayout.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
LiveActivityfields, so nothing changes on the Dart side. - Android: Firebase consolidated onto BOM 34.7.0 - The plugin declared both
firebase-bom:33.16.0and an explicitfirebase-messaging-ktx:24.1.2; the explicit version silently won, making the BOM inert, and the-ktxartifacts have been merged into their base artifacts since BOM 33.x. Now a single BOM drivesfirebase-messaging(25.0.1). Verified not to raise thecompileSdkorminSdkan app needs. - Android: Guava 31.1 → 33.7.1-android - Still required for the
ListenableFuturethe native 3.x API returns. flutter_lints2.0.0 → 6.0.0 (dev dependency only;flutter analyzestays clean).
Internal #
- CI publishes from Flutter 3.32.4 instead of 3.7.12 - The release workflow ran
flutter analyzeon an SDK from April 2023, so the gate never saw what integrators see. - Example: fixed
example/pubspec.yamlDart constraint -<3.0.0only 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)passednullinto a parameter the platform declares non-null (it worked only because the method never checks); the beacon'sassignToGroup/unassignFromGroupnow usehas()plus the single-argument overload, with identical behaviour. The untypedBundle.get(key)used to enumerate a push payload is now explicitly suppressed and explained, rather than left as a bare deprecation. - Example and README:
MainApplicationextendsandroid.app.Application-io.flutter.app.FlutterApplicationis 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.