19 Commits
Author SHA1 Message Date
Matthew dd55c6b4e1 fix(ios): use wrapper script for pod install in cap:sync:ios
The cap:sync:ios npm script was failing with "pod: command not found"
because npm scripts don't inherit the same PATH environment as shell
scripts, preventing detection of pod installed via rbenv shims.

Added pod-install.sh wrapper script that:
- Detects pod via command -v or rbenv shims ($HOME/.rbenv/shims/pod)
- Executes pod install with the found command
- Matches the pod detection logic used in build-native.sh

Updated cap:sync:ios script to use the wrapper instead of calling
pod install directly, ensuring consistent pod detection across
all build contexts.
2026-01-15 23:05:45 -08:00
Matthew 95bf0f03c9 feat(ios): update test app for iOS-specific methods and update checklist
Update iOS test app to use iOS-specific methods and remove Android-specific
code for better platform parity:

iOS Test App Updates:
- Remove Android-specific UI elements:
  - Removed "Exact Alarms" status (Android-only feature)
  - Removed "Channel" status (Android notification channels)
- Add iOS-specific UI elements:
  - Added "Background Refresh" status (BGTaskScheduler registration)
  - Added "Pending" notifications count display
- Replace Android-specific methods:
  - Removed isChannelEnabled() calls
  - Added getBackgroundTaskStatus() for background task registration
  - Added getPendingNotifications() for pending notification count
  - Updated loadPermissionStatus() to use getNotificationPermissionStatus()
- Update error handling:
  - Removed EXACT_ALARM_PERMISSION_REQUIRED error code references
  - Added iOS-specific error handling for NOTIFICATION_PERMISSION_DENIED
- Update checkStatus() handling:
  - Removed Android-specific fields (channelEnabled, exactAlarmsGranted)
  - Added iOS-specific status information (pending notifications)
- Add iOS-specific action buttons:
  - "Open Settings" button (openNotificationSettings)
  - "Background Refresh" button (openBackgroundAppRefreshSettings)
- Add iOS-specific helper functions:
  - loadBackgroundRefreshStatus() - checks BGTaskScheduler registration
  - loadPendingNotificationsStatus() - displays pending notification count
  - openNotificationSettings() - opens iOS notification settings
  - openBackgroundRefreshSettings() - opens Background App Refresh settings

iOS Implementation Checklist Updates:
- Mark integration tests as complete (DailyNotificationRecoveryIntegrationTests)
- Mark data conversion helpers as complete (DailyNotificationDataConversions.swift)
- Mark termination detection tests as complete
- Mark boot detection tests as complete
- Mark partial failure scenario tests as complete
- Update document version to 1.1.0
- Update last updated date to 2025-12-24

Achieves iOS-Android parity by using platform-appropriate methods and APIs.
2025-12-25 00:53:22 -08:00
Matthew 332dfbad75 feat(ios): enhance background task handlers and documentation
Enhance background task handlers with recovery logic and comprehensive
code documentation:

Background Task Handlers (Section 3.3):
- Enhance handleBackgroundFetch with recovery logic:
  - Verify scheduled notifications after fetch
  - Schedule next background task automatically
  - Improved expiration handling with graceful cleanup
- Enhance handleBackgroundNotify with recovery logic:
  - Verify scheduled notifications state
  - Prepare for next task scheduling
  - Improved expiration handling with graceful cleanup
- Add getNextScheduledNotificationTime() helper method
  - Wraps scheduler.getNextNotificationTime() with timeout
  - Used for automatic next task scheduling

Code Documentation (Section 10.1):
- Add comprehensive file-level documentation to ReactivationManager:
  - Purpose, features, architecture overview
  - Recovery scenarios supported
  - Error handling approach
  - Thread safety notes
  - Cross-references to requirements docs
- Add detailed method-level documentation:
  - performRecovery(): process, scenarios, error handling
  - detectScenario(): detection logic, error handling
  - performColdStartRecovery(): steps, return values
  - detectMissedNotifications(): criteria, error handling
  - verifyFutureNotifications(): verification process
  - rescheduleMissingNotification(): process, throws
  - handleTerminationRecovery(): comprehensive recovery
  - performBootRecovery(): boot recovery process
  - recordRecoveryHistory(): history recording
  - recordRecoveryFailure(): failure recording
  - detectBootScenario(): detection logic
  - updateLastLaunchTime(): storage details
  - verifyBGTaskRegistration(): diagnostic method
- Add @param, @return, @throws tags to all methods
- Document error handling behavior for all methods

Implementation Status (Section 10.2):
- Update ios/Plugin/README.md with current status:
  - Mark all completed features as ✅
  - Add new components (DAO classes, ReactivationManager)
  - Update version to 1.1.0
  - Add recovery scenarios supported
  - Update architecture overview
  - Add last updated date (2025-12-08)

Completes sections 3.3, 10.1, and 10.2 of iOS implementation checklist.
2025-12-09 19:09:07 -08:00
Matthew 3649e76c49 feat(ios): add error handling and integration tests
Implement comprehensive error handling and integration test suite:

Error Handling (Section 8):
- Add iOS-specific error codes to DailyNotificationErrorCodes:
  - NOTIFICATION_PERMISSION_DENIED
  - PENDING_NOTIFICATION_LIMIT_EXCEEDED
  - BG_TASK_NOT_REGISTERED
  - BG_TASK_EXECUTION_FAILED
  - BACKGROUND_REFRESH_DISABLED
- Add helper methods for iOS-specific error responses
- Enhance error handling in ReactivationManager:
  - Database errors handled gracefully (non-fatal)
  - Notification center errors handled gracefully (non-fatal)
  - Scheduling errors handled gracefully (non-fatal)
  - All errors logged, app continues normally
  - Partial results returned when operations fail
- Update plugin methods to use iOS-specific error codes:
  - getNotificationPermissionStatus uses NOTIFICATION_PERMISSION_DENIED

Integration Tests (Section 9.2):
- Add DailyNotificationRecoveryIntegrationTests:
  - Full recovery flow tests (cold start, termination)
  - Error handling tests (database, notification center, scheduling)
  - App stability tests (no crashes, concurrent operations)
  - Partial recovery tests
  - Timeout handling tests
- Test coverage:
  - 10 integration tests covering recovery scenarios
  - Error handling verification
  - App stability verification
  - Concurrent operation safety

Completes sections 8.1, 8.2, and 9.2 of iOS implementation checklist.
2025-12-09 02:46:13 -08:00
Matthew 12d8536588 feat(ios): enhance recovery logging and metrics recording
Implement comprehensive logging and observability for recovery operations:

- Add HistoryDAO for Core Data history recording
  - recordRecovery() method with execution time tracking
  - recordRecoveryFailure() method with detailed error info
  - Query helpers for history retrieval
- Enhance DailyNotificationReactivationManager logging:
  - Add execution time tracking (startTime/endTime)
  - Enhanced error logging with NSError details (domain, code, userInfo)
  - Comprehensive logging at each recovery step
  - Missed/future notification count logging
- Implement Core Data persistence for recovery metrics:
  - Recovery execution time
  - Missed notification count
  - Rescheduled notification count
  - Verified notification count
  - Error count
  - Diagnostic JSON with full recovery context
- Update recovery methods to record history:
  - Cold start recovery
  - Termination recovery
  - Boot recovery
  - All with timing and metrics

Completes section 7.1 (Recovery Logging) and 7.2 (Metrics Recording)
of iOS implementation checklist.
2025-12-09 02:37:27 -08:00
Matthew a90d08c425 feat(ios): add Core Data DAO layer and unit tests
Implement comprehensive data access layer for Core Data entities:

- Add NotificationContentDAO, NotificationDeliveryDAO, and NotificationConfigDAO
  with full CRUD operations and query helpers
- Add DailyNotificationDataConversions utility for type conversions
  (Date ↔ Int64, Int ↔ Int32, JSON, optional strings)
- Update PersistenceController with entity verification and migration policies
- Add comprehensive unit tests for all DAO classes and data conversions
- Update Core Data model with NotificationContent, NotificationDelivery,
  and NotificationConfig entities (relationships and indexes)
- Integrate ReactivationManager into DailyNotificationPlugin.load()

DAO Features:
- Create/Insert methods with dictionary support
- Read/Query methods with predicates (by timesafariDid, notificationType,
  scheduledTime range, deliveryStatus, etc.)
- Update methods (touch, updateDeliveryStatus, recordUserInteraction)
- Delete methods (by ID, by key, delete all)
- Relationship management (NotificationContent ↔ NotificationDelivery)
- Cascade delete support

Test Coverage:
- 328 lines: DailyNotificationDataConversionsTests (time, numeric, string, JSON)
- 490 lines: NotificationContentDAOTests (CRUD, queries, updates)
- 415 lines: NotificationDeliveryDAOTests (CRUD, relationships, cascade delete)
- 412 lines: NotificationConfigDAOTests (CRUD, queries, active filtering)

All tests use in-memory Core Data stack for isolation and speed.

Completes sections 4.4, 4.5, and 6.0 of iOS implementation checklist.
2025-12-09 02:23:05 -08:00
Matthew dd8d67462f docs(ios): add comprehensive iOS implementation documentation
Adds complete iOS documentation suite to support iOS implementation
parity with Android features. Includes implementation directives,
recovery scenario mappings, database migration guide, troubleshooting
guide, and test scripts.

New Documentation:
- iOS Implementation Directive: Phase-based implementation guide
  mirroring Android structure with iOS-specific considerations
- iOS Recovery Scenario Mapping: Maps Android recovery scenarios
  to iOS equivalents with detection logic comparisons
- iOS Core Data Migration Guide: Complete Room → Core Data entity
  mappings with implementation checklist for missing entities
- iOS Troubleshooting Guide: Common issues, debugging techniques,
  and error code reference

Enhanced Documentation:
- API.md: Added iOS-only methods (permissions, background tasks,
  pending notifications), platform differences table, and iOS-specific
  error types. Updated version to 2.3.0.

Test Infrastructure:
- iOS test scripts for Phase 1 (cold start), Phase 2 (termination),
  and Phase 3 (boot recovery) testing scenarios

All documentation addresses gaps identified in iOS Implementation
Documentation Review and provides foundation for iOS recovery feature
implementation (currently pending).

Note: iOS recovery features (ReactivationManager, scenario detection)
are NOT yet implemented. Documentation is ready to guide implementation.
2025-12-08 23:36:30 -08:00
Matthew dac9cf3ddc Merge branch 'master' into ios-2 2025-12-08 22:42:23 -08:00
Matthew b44fd3a435 feat(test-app): add iOS project structure and configuration
- Add iOS .gitignore for Capacitor iOS project
- Add Podfile with DailyNotificationPlugin dependency
- Add Xcode project and workspace files
- Add AppDelegate.swift for iOS app entry point
- Add Assets.xcassets with app icons and splash screens
- Add Base.lproj storyboards for launch and main screens

These files are generated by Capacitor when iOS platform is added.
The Podfile correctly references DailyNotificationPlugin from node_modules.
2025-11-20 23:10:17 -08:00
Matthew 95b3d74ddc chore: update package-lock.json with peer dependency flags
- Add peer: true flags to Capacitor dependencies
- Reflects npm install updates for peer dependency handling
2025-11-20 23:07:22 -08:00
Matthew cebf341839 fix(test-app): iOS permission handling and build improvements
- Add BGTask identifiers and background modes to iOS Info.plist
- Fix permission method calls (checkPermissionStatus vs checkPermissions)
- Implement Android-style permission checking pattern
- Add "Request Permissions" action card with check-then-request flow
- Fix simulator selection in build script (use device ID for reliability)
- Add Podfile auto-fix to fix-capacitor-plugins.js
- Update build documentation with unified script usage

Fixes:
- BGTask registration errors (Info.plist missing identifiers)
- Permission method not found errors (checkPermissions -> checkPermissionStatus)
- Simulator selection failures (now uses device ID)
- Podfile incorrect pod name (TimesafariDailyNotificationPlugin -> DailyNotificationPlugin)

The permission flow now matches Android: check status first, then show
system dialog if needed. iOS system dialog appears automatically when
requestNotificationPermissions() is called.

Files changed:
- test-apps/daily-notification-test/ios/App/App/Info.plist (new)
- test-apps/daily-notification-test/src/lib/typed-plugin.ts
- test-apps/daily-notification-test/src/views/HomeView.vue
- test-apps/daily-notification-test/scripts/build.sh (new)
- test-apps/daily-notification-test/scripts/fix-capacitor-plugins.js
- test-apps/daily-notification-test/docs/BUILD_QUICK_REFERENCE.md
- test-apps/daily-notification-test/README.md
- test-apps/daily-notification-test/package.json
- test-apps/daily-notification-test/package-lock.json
2025-11-20 23:05:49 -08:00
Matthew e6cd8eb055 fix(ios): remove unused variable warning in AppDelegate
Replace if let binding with boolean is check for CAPBridgedPlugin
conformance test. This eliminates the compiler warning about unused
variable 'capacitorPluginType' while maintaining the same diagnostic
functionality.
2025-11-19 22:03:25 -08:00
Matthew 92bb566631 fix(ios): configure method parameter parsing and improve build process
Fix configure() method to read parameters directly from CAPPluginCall
instead of expecting nested options object, matching Android implementation.

Improve build process to ensure canonical UI is always copied:
- iOS build script: Copy www/index.html to test app before build
- Android build.gradle: Add copyCanonicalUI task to run before build
- Ensures test apps always use latest UI from www/index.html

This fixes the issue where configure() was returning 'Configuration
options required' error because it expected a nested options object
when Capacitor passes parameters directly on the call object.
2025-11-19 20:09:01 -08:00
Matthew 3d9254e26d feat(ios): show notifications in foreground and add visual feedback
Implement UNUserNotificationCenterDelegate in AppDelegate to display
notifications when app is in foreground. Add visual feedback indicator
in test app UI to confirm notification delivery.

Changes:
- AppDelegate: Conform to UNUserNotificationCenterDelegate protocol
- AppDelegate: Implement willPresent and didReceive delegate methods
- AppDelegate: Set delegate at multiple lifecycle points to ensure
  it's always active (immediate, after Capacitor init, on app active)
- UI: Add notification received indicator in status card
- UI: Add periodic check for notification delivery (every 5 seconds)
- UI: Add instructions on where to look for notification banner
- Docs: Add IOS_LOGGING_GUIDE.md for debugging iOS logs

This fixes the issue where scheduled notifications were not visible
when the app was in the foreground. The delegate method now properly
presents notifications with banner, sound, and badge options.

Verified working: Logs show delegate method called successfully when
notification fires, with proper presentation options set.
2025-11-19 01:15:20 -08:00
Matthew ee0e85d76a Merge branch 'master' into ios-2 2025-11-18 21:27:55 -08:00
Matthew 9f26588331 fix(ios): iOS 13.0 compatibility and test app UI unification
Fixed iOS 13.0 compatibility issue in test harness by replacing Logger
(iOS 14+) with os_log (iOS 13+). Fixed build script to correctly detect
and sync Capacitor config from App subdirectory. Unified both Android
and iOS test app UIs to use www/index.html as the canonical source.

Changes:
- DailyNotificationBackgroundTaskTestHarness: Replace Logger with os_log
  for iOS 13.0 deployment target compatibility
- build-ios-test-app.sh: Fix Capacitor sync path detection to check
  both current directory and App/ subdirectory for config files
- test-apps: Update both Android and iOS test apps to use www/index.html
  as the canonical UI source for consistency

This ensures the plugin builds on iOS 13.0+ and both test apps provide
the same testing experience across platforms.
2025-11-18 21:25:14 -08:00
Matthew b74d38056f Merge branch 'master' into ios-2 2025-11-18 19:29:26 -08:00
Matthew 4d53faabad chore: update 2025-11-17 00:07:51 -08:00
Matthew d7a2dbb9fd docs(ios): update test app docs with recent implementation details
Updated iOS test app documentation to reflect recent implementation work:
channel methods, permission methods, BGTaskScheduler simulator limitation,
and plugin discovery troubleshooting.

Changes:
- Added channel methods (isChannelEnabled, openChannelSettings) to UI mapping
- Fixed permission method name (requestPermissions → requestNotificationPermissions)
- Added checkPermissionStatus to UI mapping
- Added Channel Management section explaining iOS limitations
- Added BGTaskScheduler simulator limitation documentation (Code=1 is expected)
- Added plugin discovery troubleshooting section (CAPBridgedPlugin conformance)
- Added permission and channel methods to behavior classification table
- Updated Known OS Limitations with simulator-specific BGTaskScheduler behavior

Files modified:
- doc/test-app-ios/IOS_TEST_APP_REQUIREMENTS.md: UI mapping, debugging scenarios
- doc/test-app-ios/IOS_PREFETCH_TESTING.md: Known limitations, behavior classification
2025-11-16 21:53:56 -08:00