BREAKING CHANGE (iOS): configureNativeFetcher now requires DailyNotificationPlugin.registerNativeFetcher(_) first, aligned with Android. iOS: - Add NativeNotificationContentFetcher SPI, registry, FetchContext, timeout helper - Add updateStarredPlans / getStarredPlans; persist daily_notification_timesafari.starredPlanIds - Chained dual: prefetch only on scheduleDualNotification; arm one-shot UN after fetch - configureNativeFetcher invokes fetcher.configure; BG fetch prefers registered fetcher - Public NotificationContent for host implementations Android: - Dual notify alarm scheduled after dual FetchWorker completes (DualScheduleNotifyScheduler) - Persist dual_notify_schedule_id; remove upfront NotifyReceiver for dual setup Docs: CONSUMING_APP_HANDOFF_IOS_NATIVE_FETCHER_AND_CHAINED_DUAL.md; CHANGELOG 3.0.0 Made-with: Cursor
11 KiB
11 KiB
Changelog
All notable changes to the Daily Notification Plugin will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[3.0.0] - 2026-04-02
Added
- iOS:
NativeNotificationContentFetcherSPI,FetchContext,NativeNotificationFetcherRegistry, andDailyNotificationPlugin.registerNativeFetcher(_:)for host-provided fetch (parity with AndroidsetNativeFetcher). - iOS:
updateStarredPlans/getStarredPlansplugin methods; starred IDs stored under UserDefaults keydaily_notification_timesafari.starredPlanIds(JSON array string). - Android:
DualScheduleNotifySchedulerandDUAL_NOTIFY_SCHEDULE_ID_KEYto arm the dual user notification after prefetch completes. - Docs:
doc/CONSUMING_APP_HANDOFF_IOS_NATIVE_FETCHER_AND_CHAINED_DUAL.mdfor consuming apps.
Changed
- iOS:
configureNativeFetcherrequires a registered native fetcher (matches Android); callsconfigureon the fetcher; background fetch prefers registered fetcher with timeout, then legacy in-plugin HTTP when no fetcher + config exists. - iOS: Dual (
scheduleDualNotification) uses chained scheduling: prefetch BG task only, then one-shot user notification after fetch (armChainedDualNotificationAfterPrefetch), with max slip before fallback copy. - iOS:
NotificationContentispublicfor host fetcher implementations. - Android: Dual notify exact alarm is no longer scheduled in
ScheduleHelper.scheduleDualNotification; it is scheduled whenFetchWorkercompletes (max(nextNotifyAt, now)), with recovery enqueue unchanged.
Breaking
- iOS:
configureNativeFetcherrejects ifregisterNativeFetcherwas not called first.
[2.1.5] - 2026-03-25
Changed
- Android: Dual (
scheduleDualNotification) content prefetch uses WorkManager withinitialDelayto the nextcontentFetch.scheduleoccurrence (not an immediate fetch at setup). After each successful dual fetch, the next prefetch is re-enqueued from persisted dual config. - Android: Dual prefetch with no
contentFetch.urlinvokes the registeredNativeNotificationContentFetcherwhen present (same SPI asDailyNotificationFetchWorker); otherwise mock JSON is used for development. - Android:
content_cacherows includecacheScope(dual|daily|legacy). Dual notify resolution reads onlydual; daily reminder fetches writedaily, avoiding cross-feature overwrites. Database version 4 with migration from v3.
Documentation
- Android:
doc/platform/android/ANDROID_DUAL_SCHEDULE_NATIVE_FETCH_AND_CACHE_SCOPE.md(implementation plan; see repo for details).
[2.1.4] - 2026-03-20
Fixed
- Android:
scheduleDualNotification/parseContentFetchConfigno longer requirestimeout,retryAttempts, andretryDelayincontentFetch(optional fields per TypeScript). Omitted values defer toFetchWorkerdefaults. - Android:
parseUserNotificationConfigno longer uses strictgetBoolean/getStringfor optionaluserNotificationfields (title,body,sound,vibration,priority). Omitted keys no longer throwJSONException; native scheduling applies existing defaults (NotifyReceiver/DualScheduleHelper).
Documentation
- README: Notes for omitted
contentFetchand optionaluserNotificationfields on Android.
[1.1.6] - 2026-02-16
Fixed
- Android: Alarm set after edit/reschedule now fires. Removed
existingPendingIntent.cancel()in the "cancel existing alarm before rescheduling" path so the PendingIntent passed tosetAlarmClockis not cancelled (onlyalarmManager.cancel()is used), fixing no-fire on some devices.
[1.1.5] - 2026-02-16
Fixed
- Android: Rollover work using a
daily_rollover_*schedule id no longer overwrites the app's schedule row in the DB.NotifyReceiverpost-schedule update skips the "first enabled notify" fallback whenstableScheduleIdstarts withdaily_rollover_, so the app's reminder (e.g.daily_timesafari_reminder) keeps the correctnextRunAtafter a notification fires.
Added
- Docs:
doc/platform/android/CONSUMING_APP_ANDROID_NOTES.md— notes for consuming apps on debouncing doublescheduleDailyNotificationcalls and debugging alarms that are scheduled but do not fire (logcat withDailyNotificationReceiver).
[1.1.4] - 2026-02-16
Fixed
- Android: Re-setting a daily notification (edit/save same time) no longer cancels the alarm and then skips re-scheduling. DB idempotence in
NotifyReceiver.scheduleExactNotification()now runs only when!skipPendingIntentIdempotence, so the app reset flow can re-register the alarm. - Android: Static reminder title/body no longer revert to fallback after the first fire.
DailyNotificationWorker.scheduleNextNotification()now preservesis_static_reminderand stablescheduleIdon rollover so the next occurrence keeps custom text.
Added
- Android:
cancelDailyReminder(call)inDailyNotificationPlugin.ktfor parity with iOS. AcceptsreminderId(orid,reminder_id,scheduleId), cancels the AlarmManager alarm for that id, and performs best-effort DB cleanup (setEnabledfalse,updateRunTimesnull).
[1.1.3] - 2026-02-13
Fixed
- Android (Java): Java call sites for
NotifyReceiver.scheduleExactNotification()now pass the 8th parameterskipPendingIntentIdempotence, fixing "actual and formal argument lists differ in length" when building consuming apps. UpdatedDailyNotificationReceiver.javaandDailyNotificationWorker.java.
[1.1.2] - 2026-02-13
Fixed
- Android: Second daily notification not firing after reschedule. After cancel-then-schedule, the idempotence check could still see the cancelled PendingIntent in Android's cache and skip the new schedule. The cancel-then-schedule path now skips PendingIntent-based idempotence so the new alarm is always registered.
[1.1.1] - 2026-02-05
Fixed
- Android: Target alarm broadcast to app package so receiver is triggered correctly
Documentation
- EMULATOR_GUIDE: prerequisites, API 35, Apple Silicon; build.sh Android-only sync
[2.1.0] - 2025-01-02
Added
- Static Daily Reminders: New functionality for simple daily notifications without network content
- Cross-Platform Reminder API: Consistent reminder management across Android, iOS, and Web
- Reminder Management: Full CRUD operations for reminder scheduling and management
- Offline Reminder Support: Reminders work completely offline without content caching
- Rich Reminder Customization: Support for custom titles, bodies, sounds, vibration, and priorities
- Persistent Reminder Storage: Reminders survive app restarts and device reboots
New Methods
scheduleDailyReminder(options): Schedule a simple daily remindercancelDailyReminder(reminderId): Cancel a specific remindergetScheduledReminders(): Get all scheduled remindersupdateDailyReminder(reminderId, options): Update an existing reminder
Features
- No Network Dependency: Static reminders work completely offline
- Simple Time Format: Easy HH:mm time format (e.g., "09:00")
- Priority Levels: Support for low, normal, and high priority notifications
- Repeat Options: Configurable daily repetition
- Platform Integration: Native notification channels and categories
- Test App Integration: Complete test app support for reminder functionality
Documentation
- Updated README.md with static reminder examples and API reference
- Added comprehensive usage examples in USAGE.md
- Created detailed example file:
examples/static-daily-reminders.ts - Enhanced test apps with reminder management UI
[1.0.0] - 2024-03-20
Added
- Initial release of the Daily Notification Plugin
- Basic notification scheduling functionality
- Support for multiple notification schedules
- Timezone-aware scheduling
- Offline support with content caching
- Retry logic with exponential backoff
- Custom notification content handlers
- Event-based notification handling
- Comprehensive settings management
- TypeScript support with full type definitions
Features
- Schedule daily notifications at specific times
- Support for multiple notification schedules
- Timezone-aware scheduling
- Offline support with content caching
- Retry logic with exponential backoff
- Custom notification content handlers
- Event-based notification handling
- Comprehensive settings management
Security
- HTTPS-only network requests
- Content validation before display
- Secure storage of sensitive data
- Permission-based access control
- No sensitive data in logs
Documentation
- Comprehensive API documentation
- Usage examples for basic and advanced scenarios
- Enterprise-level implementation examples
- Security best practices
- Platform-specific implementation details
Testing
- Unit tests for core functionality
- Integration tests for platform features
- Advanced scenario tests
- Enterprise feature tests
- Security validation tests
[0.9.0] - 2024-03-15
Added
- Beta release with core functionality
- Basic notification scheduling
- Simple content handling
- Basic event system
Changed
- Improved error handling
- Enhanced type definitions
- Better documentation
Fixed
- Initial bug fixes and improvements
- TypeScript type issues
- Documentation clarity
[0.8.0] - 2024-03-10
Added
- Alpha release with basic features
- Initial plugin structure
- Basic TypeScript interfaces
- Simple notification scheduling
Changed
- Early development improvements
- Initial documentation
- Basic test setup
Fixed
- Early bug fixes
- Initial type issues
- Basic documentation
[Unreleased]
Added
- Enterprise features
- Notification queue system
- A/B testing support
- Advanced analytics tracking
- User preferences management
- Content personalization
- Rate limiting
- Additional test scenarios
- More example implementations
- Enhanced documentation
Changed
- Improved error handling
- Enhanced type definitions
- Better documentation structure
- More comprehensive examples
Fixed
- TypeScript type issues
- Documentation clarity
- Test coverage gaps
- Example code improvements
Security
- Enhanced security measures
- Additional validation
- Improved error handling
- Better logging practices
Documentation
- Added enterprise usage examples
- Enhanced API documentation
- Improved security guidelines
- Better troubleshooting guides
Testing
- Added enterprise scenario tests
- Enhanced test coverage
- Improved test organization
- Better test documentation