Summary
- Improve local notification reliability on iOS and Android without adding dependencies.
- Keep diffs minimal: platform tweaks + small service/UI updates.

Changes
- iOS
  - ios/Runner/AppDelegate.swift
    - Set UNUserNotificationCenter delegate on launch.
    - Implement willPresent to show [.banner, .sound, .badge] while in foreground.
- Android
  - android/app/src/main/AndroidManifest.xml
    - Add RECEIVE_BOOT_COMPLETED for reboot rescheduling by plugin.
    - Add SCHEDULE_EXACT_ALARM to allow exact timing on Android 12+.
  - lib/services/notification_service.dart
    - Create Android channels on init (subscription_channel, expiration_channel).
    - Use AndroidScheduleMode.exactAllowWhileIdle for scheduled notifications.
    - Ensure iOS DarwinNotificationDetails always present alert/sound/badge.
    - Fix local variable overshadowing method parameter (title).
    - Add canScheduleExactAlarms()/requestExactAlarmsPermission() wrappers.
  - lib/screens/settings_screen.dart
    - Add UI entry to request exact alarms permission when not granted (Android 12+).

Validation
- Ran scripts/check.sh
  - Formatting check: OK
  - flutter analyze: No issues
  - flutter test: All tests passed
- Manual assertions
  - Foreground iOS notifications display banners/sounds.
  - Android channels created proactively to avoid muted/low-importance.

Risk & Rollback
- Risk
  - Android 12+: Exact alarms require user approval in Settings > Special access > Alarms & reminders.
  - Slight battery impact from exact alarms.
- Rollback
  - Remove SCHEDULE_EXACT_ALARM and RECEIVE_BOOT_COMPLETED from AndroidManifest.
  - Switch schedule mode back to AndroidScheduleMode.inexact in NotificationService.

Notes
- No dependency changes.
- Reboot rescheduling relies on flutter_local_notifications standard behavior with RECEIVE_BOOT_COMPLETED.

