# iOS Implementation

This directory contains the iOS-specific implementation of the DailyNotification plugin.

**Last Updated**: 2025-12-22  
**Version**: 1.1.0

## Current Implementation Status

**✅ IMPLEMENTED:**
- Basic plugin structure (`DailyNotificationPlugin.swift`)
- UserDefaults for local data storage
- Power management (`DailyNotificationPowerManager.swift`)
- Battery optimization handling
- iOS notification categories and actions
- **App Launch Recovery** (`DailyNotificationReactivationManager.swift`)
  - Cold start recovery
  - Termination recovery
  - Boot recovery
  - Scenario detection
  - Missed notification detection
  - Future notification verification
- **Core Data Integration**
  - NotificationContent, NotificationDelivery, NotificationConfig entities
  - DAO classes for all entities (CRUD operations)
  - Data type conversions (Date ↔ Int64, etc.)
  - PersistenceController with entity verification
- **Logging & Observability**
  - Comprehensive recovery logging
  - Metrics recording in Core Data History
  - Execution time tracking
- **Error Handling**
  - iOS-specific error codes
  - Graceful error handling (non-fatal)
  - Partial results on failures
- **API Methods**
  - iOS-specific notification permission methods
  - Background task status methods
  - Pending notifications query

**⚠️ PARTIALLY IMPLEMENTED:**
- `BGTaskScheduler` for background data fetching (basic registration)
- Background task management (needs enhancement)

**❌ NOT IMPLEMENTED (Planned):**
- Silent push nudge support
- T–lead prefetch logic (enhancement)

## Implementation Details

The iOS implementation currently uses:

- `UNUserNotificationCenter` for notification management ✅
- `UserDefaults` for local data storage ✅
- iOS notification categories and actions ✅
- Power management and battery optimization ✅
- **Core Data** for structured data persistence ✅
- **BGTaskScheduler** for background task registration ✅
- **App Launch Recovery** for notification reconciliation ✅

**Architecture:**
- **ReactivationManager**: Handles app launch recovery scenarios
- **DAO Layer**: Core Data access objects for all entities
- **Data Conversions**: Type conversion utilities (Date, Int, String, JSON)
- **History Recording**: Core Data persistence for recovery metrics
- **Error Handling**: Comprehensive error codes and graceful degradation

**Planned additions:**
- Enhanced background task management
- Silent push support

## Native Code Location

The native iOS implementation is located in the `ios/` directory at the project root.

## Key Components

1. `DailyNotificationPlugin.swift`: Main plugin class ✅
2. `DailyNotificationPowerManager.swift`: Power state management ✅
3. `DailyNotificationConfig.swift`: Configuration options ✅
4. `DailyNotificationMaintenanceWorker.swift`: Maintenance tasks ✅
5. `DailyNotificationLogger.swift`: Logging system ✅
6. **`DailyNotificationReactivationManager.swift`**: App launch recovery ✅
7. **`HistoryDAO.swift`**: Recovery history persistence ✅
8. **`NotificationContentDAO.swift`**: Notification content CRUD ✅
9. **`NotificationDeliveryDAO.swift`**: Delivery tracking CRUD ✅
10. **`NotificationConfigDAO.swift`**: Configuration CRUD ✅
11. **`DailyNotificationDataConversions.swift`**: Type conversion utilities ✅
12. **`DailyNotificationErrorCodes.swift`**: iOS-specific error codes ✅
13. **`DailyNotificationModel.swift`**: Core Data model & PersistenceController ✅

**Background Task Components:**
- `DailyNotificationBackgroundTasks.swift`: Background task handlers ⚠️ (basic)
- `DailyNotificationBackgroundTaskManager.swift`: Task management ⚠️ (basic)

## Implementation Notes

- Uses UserDefaults for lightweight data storage ✅
- Uses Core Data for structured data persistence ✅
- Implements proper battery optimization handling ✅
- Supports iOS notification categories and actions ✅
- Handles background refresh limitations ✅
- **App launch recovery with scenario detection** ✅
- **Comprehensive error handling (non-fatal)** ✅
- **Metrics recording and observability** ✅
- **BGTaskScheduler registration** ✅

**Recovery Scenarios Supported:**
- ✅ Cold Start: App terminated, notifications may need verification
- ✅ Termination: App terminated, all notifications cleared
- ✅ Boot: Device rebooted, full recovery needed
- ✅ Warm Start: No recovery needed (optimization)

**Planned Features:**
- Enhanced background task budget management
- Silent push notification support
- Advanced prefetch logic

## Schema Versioning Strategy

**Current Schema Version:** `1` (initial schema)

The iOS implementation uses **explicit schema versioning** to achieve parity with Android's Room database versioning approach. This provides observability and migration tracking without interfering with CoreData's automatic migration capabilities.

### Versioning Approach

**CoreData Auto-Migration Remains Authoritative**

The schema version is a **logical contract**, not a forced migration trigger. CoreData auto-migration (`shouldMigrateStoreAutomatically = true`) remains the authoritative mechanism for schema changes. Version mismatches are **logged, not blocked**.

**Version Tracking**

Schema version is stored in CoreData persistent store metadata using `NSPersistentStore` metadata dictionary. This approach:

- ✅ Non-intrusive (does not require schema changes)
- ✅ Observable (version can be read at any time)
- ✅ Compatible with CoreData auto-migration
- ✅ Matches Android's explicit versioning pattern

**Current Implementation**

- **Schema Version:** `1` (initial schema, established 2025-09-22)
- **Version Storage:** `NSPersistentStore` metadata key `"schema_version"`
- **Version Check:** Performed during `PersistenceController` initialization
- **Logging:** Version logged on store load; mismatches logged as warnings

### Migration Contract

**When to Bump Schema Version**

The schema version should be incremented when:

1. **Entity changes:**
   - Adding new entities
   - Removing entities (rare, requires data migration)
   - Renaming entities (requires explicit migration)

2. **Attribute changes:**
   - Adding new required attributes (requires default values or migration)
   - Removing attributes (requires data cleanup)
   - Changing attribute types (requires type conversion)
   - Renaming attributes (requires explicit migration)

3. **Relationship changes:**
   - Adding/removing relationships
   - Changing relationship cardinality
   - Renaming relationships

**When NOT to Bump**

- Adding optional attributes (CoreData handles automatically)
- Adding optional relationships (CoreData handles automatically)
- Changing default values (no schema change required)
- Adding indexes (metadata change, not schema change)

**Version Bump Process**

1. Update CoreData model in Xcode (add/remove/modify entities/attributes)
2. Increment schema version constant in `PersistenceController`
3. Update metadata on next store load
4. Document migration in changelog
5. Update parity matrix if versioning strategy changes

### Android Parity

**Android:** Room database with explicit `version = 2` and `Migration` objects  
**iOS:** CoreData with explicit schema version `1` in metadata + auto-migration

Both platforms now have:
- ✅ Explicit version tracking
- ✅ Migration documentation
- ✅ Version observability
- ✅ Migration contract defined

**Parity Status:** ✅ **Explicit versioning** (P2.1 complete)

### Related Documentation

- **Android Schema Versioning:** `android/src/main/java/com/timesafari/dailynotification/DatabaseSchema.kt` (Room `version = 2`)
- **CoreData Model:** `ios/Plugin/DailyNotificationModel.xcdatamodeld`
- **PersistenceController:** `ios/Plugin/DailyNotificationModel.swift`
- **Parity Matrix:** `doc/progress/04-PARITY-MATRIX.md`

## Testing

Run iOS-specific tests with:

```bash
npm run test:ios
``` 