diff --git a/apps/lib/core/notifications/ios_notification_payload_bridge.dart b/apps/lib/core/notifications/ios_notification_payload_bridge.dart new file mode 100644 index 0000000..4842b34 --- /dev/null +++ b/apps/lib/core/notifications/ios_notification_payload_bridge.dart @@ -0,0 +1,27 @@ +import 'dart:convert'; +import 'package:shared_preferences/shared_preferences.dart'; +import '../../features/calendar/reminders/models/reminder_payload.dart'; + +class IOSNotificationPayloadBridge { + static const String _key = 'pending_notification_payload'; + final SharedPreferences _prefs; + + IOSNotificationPayloadBridge(this._prefs); + + Future getPendingPayload() async { + final raw = _prefs.getString(_key); + if (raw == null || raw.isEmpty) { + return null; + } + try { + final json = Map.from(jsonDecode(raw) as Map); + return ReminderPayload.fromJson(json); + } catch (_) { + return null; + } + } + + Future clearPendingPayload() async { + await _prefs.remove(_key); + } +} diff --git a/apps/test/core/notifications/ios_notification_payload_bridge_test.dart b/apps/test/core/notifications/ios_notification_payload_bridge_test.dart new file mode 100644 index 0000000..6965bdd --- /dev/null +++ b/apps/test/core/notifications/ios_notification_payload_bridge_test.dart @@ -0,0 +1,44 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:social_app/core/notifications/ios_notification_payload_bridge.dart'; +import 'dart:convert'; + +void main() { + group('IOSNotificationPayloadBridge', () { + test('启动时读取待处理的 notification payload', () async { + SharedPreferences.setMockInitialValues({ + 'pending_notification_payload': jsonEncode({ + 'eventId': 'evt_123', + 'title': 'Test Event', + 'startAt': '2026-03-20T10:00:00Z', + 'mode': 'single', + }), + }); + + final prefs = await SharedPreferences.getInstance(); + final bridge = IOSNotificationPayloadBridge(prefs); + final payload = await bridge.getPendingPayload(); + + expect(payload?.eventId, 'evt_123'); + expect(payload?.title, 'Test Event'); + }); + + test('处理完成后清理 UserDefaults', () async { + SharedPreferences.setMockInitialValues({ + 'pending_notification_payload': jsonEncode({ + 'eventId': 'evt_123', + 'title': 'Test Event', + 'startAt': '2026-03-20T10:00:00Z', + 'mode': 'single', + }), + }); + + final prefs = await SharedPreferences.getInstance(); + final bridge = IOSNotificationPayloadBridge(prefs); + await bridge.clearPendingPayload(); + + final remaining = prefs.getString('pending_notification_payload'); + expect(remaining, isNull); + }); + }); +}