feat(notifications): add IOSNotificationPayloadBridge for iOS cold start payload
This commit is contained in:
@@ -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<ReminderPayload?> getPendingPayload() async {
|
||||||
|
final raw = _prefs.getString(_key);
|
||||||
|
if (raw == null || raw.isEmpty) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
final json = Map<String, dynamic>.from(jsonDecode(raw) as Map);
|
||||||
|
return ReminderPayload.fromJson(json);
|
||||||
|
} catch (_) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> clearPendingPayload() async {
|
||||||
|
await _prefs.remove(_key);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user