From 55035b535cd8ac00bee9a4f90ab929a25925bd43 Mon Sep 17 00:00:00 2001 From: b3ni15 Date: Fri, 6 Mar 2026 12:28:38 +0100 Subject: [PATCH] Refactor Live Activity creation to return success status and handle push token updates asynchronously --- refilc/ios/Runner/AppDelegate.swift | 8 +--- refilc/ios/livecard/LiveActivityManager.swift | 47 +++++++++---------- .../lib/api/providers/live_card_provider.dart | 28 +++++------ .../liveactivity/platform_channel.dart | 6 +-- 4 files changed, 39 insertions(+), 50 deletions(-) diff --git a/refilc/ios/Runner/AppDelegate.swift b/refilc/ios/Runner/AppDelegate.swift index 5f4a9067..997e0114 100644 --- a/refilc/ios/Runner/AppDelegate.swift +++ b/refilc/ios/Runner/AppDelegate.swift @@ -90,15 +90,11 @@ import Security } if #available(iOS 16.2, *) { - LiveActivityManager.create { [weak self] pushToken in - guard let self = self, let token = pushToken else { - result(nil) - return - } + LiveActivityManager.create { success in let deviceId = self.getOrCreateDeviceId() let bundleId = Bundle.main.bundleIdentifier ?? "" result([ - "pushToken": token, + "success": success, "deviceId": deviceId, "bundleId": bundleId, ]) diff --git a/refilc/ios/livecard/LiveActivityManager.swift b/refilc/ios/livecard/LiveActivityManager.swift index 0cd0f463..5719a373 100644 --- a/refilc/ios/livecard/LiveActivityManager.swift +++ b/refilc/ios/livecard/LiveActivityManager.swift @@ -26,8 +26,10 @@ final class LiveActivityManager { static let shared = LiveActivityManager() var currentActivity: Activity? - /// Létrehozza a Live Activity-t pushType: .token-nel, majd visszaadja az APNs push tokent. - class func create(completion: @escaping (String?) -> Void) { + /// Létrehozza a Live Activity-t pushType: .token-nel. + /// A completion azonnal meghívódik a létrehozás után (success/fail). + /// A push token később érkezik a pushTokenUpdates-en keresztül. + class func create(completion: @escaping (Bool) -> Void) { Task { // Előző activity-k eltakarítása, hogy ne legyen dupla for activity in Activity.activities { @@ -64,22 +66,28 @@ final class LiveActivityManager { activityID = activity.id print("Live Activity létrehozva. Azonosító: \(activity.id)") + // Azonnal visszatérünk — a LA látszik + completion(true) + // Dismiss/end figyelése háttérben Task { await monitorActivityState(activity: activity) } - // Az APNs token aszinkron érkezik – megvárjuk az elsőt - for await tokenData in activity.pushTokenUpdates { - let tokenHex = tokenData.map { String(format: "%02x", $0) }.joined() - activityPushToken = tokenHex - print("Live Activity push token: \(tokenHex)") - completion(tokenHex) - // Token rotation figyelése a háttérben - Task { await monitorTokenRotation(activity: activity) } - break + // Push token figyelése háttérben — az első és a rotation is + // a LiveActivityTokenUpdated notification-ön keresztül megy Flutter felé + Task { + for await tokenData in activity.pushTokenUpdates { + let tokenHex = tokenData.map { String(format: "%02x", $0) }.joined() + activityPushToken = tokenHex + print("Live Activity push token: \(tokenHex)") + NotificationCenter.default.post( + name: NSNotification.Name("LiveActivityTokenUpdated"), + object: tokenHex + ) + } } } catch { print("Hiba történt a Live Activity létrehozásakor: \(error)") - completion(nil) + completion(false) } } } @@ -103,19 +111,8 @@ final class LiveActivityManager { } /// Token rotation figyelése: ha az APNs új tokent ad ki, értesítjük a Flutter oldalt. - private class func monitorTokenRotation(activity: Activity) async { - var isFirst = true - for await tokenData in activity.pushTokenUpdates { - if isFirst { isFirst = false; continue } // Az első tokent már kezeltük - let tokenHex = tokenData.map { String(format: "%02x", $0) }.joined() - activityPushToken = tokenHex - print("Live Activity push token frissítve (rotation): \(tokenHex)") - NotificationCenter.default.post( - name: NSNotification.Name("LiveActivityTokenUpdated"), - object: tokenHex - ) - } - } + /// MEGJEGYZÉS: Már nem használjuk külön — a create() maga figyeli a pushTokenUpdates-t + /// és minden tokent (elsőt is, rotation-t is) a LiveActivityTokenUpdated notification-ön küld. class func update() { Task { diff --git a/refilc/lib/api/providers/live_card_provider.dart b/refilc/lib/api/providers/live_card_provider.dart index d53bdebc..d5d6f0e0 100644 --- a/refilc/lib/api/providers/live_card_provider.dart +++ b/refilc/lib/api/providers/live_card_provider.dart @@ -63,12 +63,15 @@ class LiveCardProvider extends ChangeNotifier { ? Duration(seconds: settings.bellDelay) : Duration.zero; - // Token rotation figyelése: ha iOS új APNs tokent ad ki, szinkronizáljuk a szerverrel + // Token figyelése: amikor az APNs tokent ad (első vagy rotation), regisztráljuk a szerverrel PlatformChannel.onTokenUpdated = (pushToken, deviceId, bundleId) { - serverSync.refreshToken( + debugPrint("Push token érkezett: $pushToken"); + serverSync.registerAndSync( + deviceId: deviceId, pushToken: pushToken, bundleId: bundleId, liveActivityColor: '#${settings.liveActivityColor.toHexString().substring(2)}', + todayLessons: _today(_timetable), ); }; @@ -413,20 +416,13 @@ class LiveCardProvider extends ChangeNotifier { Future _createAndSync() async { final result = await PlatformChannel.createLiveActivity(toMap()); - if (result != null) { - final pushToken = result['pushToken'] ?? ''; - final deviceId = result['deviceId'] ?? ''; - final bundleId = result['bundleId'] ?? ''; - if (pushToken.isNotEmpty && deviceId.isNotEmpty) { - await serverSync.registerAndSync( - deviceId: deviceId, - pushToken: pushToken, - bundleId: bundleId, - liveActivityColor: - '#${_settings.liveActivityColor.toHexString().substring(2)}', - todayLessons: _today(_timetable), - ); - } + if (result != null && result['success'] == 'true') { + debugPrint("Live Activity létrehozva, várunk a push tokenre..."); + // A regisztráció az onTokenUpdated callback-ben történik, + // amikor az APNs elküldi a push tokent. + } else { + debugPrint("Live Activity létrehozás sikertelen"); + hasActivityStarted = false; } } diff --git a/refilc/lib/api/providers/liveactivity/platform_channel.dart b/refilc/lib/api/providers/liveactivity/platform_channel.dart index 04b85773..bb2ccad5 100644 --- a/refilc/lib/api/providers/liveactivity/platform_channel.dart +++ b/refilc/lib/api/providers/liveactivity/platform_channel.dart @@ -32,8 +32,8 @@ class PlatformChannel { }); } - /// Létrehozza a Live Activity-t és visszaadja az APNs push tokent, - /// a device ID-t (Keychain UUID) és a bundle ID-t. + /// Létrehozza a Live Activity-t. Azonnal visszatér deviceId/bundleId-vel. + /// A push token később érkezik az onTokenUpdated callback-en. static Future?> createLiveActivity( Map activityData) async { if (Platform.isIOS) { @@ -44,7 +44,7 @@ class PlatformChannel { 'createLiveActivity', activityData); if (result == null) return null; return { - 'pushToken': result['pushToken'] as String? ?? '', + 'success': (result['success'] as bool? ?? false).toString(), 'deviceId': result['deviceId'] as String? ?? '', 'bundleId': result['bundleId'] as String? ?? '', };