diff --git a/ios/Classes/FlutterForegroundTaskPlugin.m b/ios/Classes/FlutterForegroundTaskPlugin.m index e4e7a71f..ec7add77 100644 --- a/ios/Classes/FlutterForegroundTaskPlugin.m +++ b/ios/Classes/FlutterForegroundTaskPlugin.m @@ -16,3 +16,12 @@ + (void)setPluginRegistrantCallback:(FlutterPluginRegistrantCallback)callback { [SwiftFlutterForegroundTaskPlugin setPluginRegistrantCallback:callback]; } @end + +@interface FlutterForegroundTaskEarlyRegistration : NSObject +@end + +@implementation FlutterForegroundTaskEarlyRegistration ++ (void)load { + [SwiftFlutterForegroundTaskPlugin registerAppRefreshForBackgroundLaunch]; +} +@end diff --git a/ios/Classes/SwiftFlutterForegroundTaskPlugin.swift b/ios/Classes/SwiftFlutterForegroundTaskPlugin.swift index 8c163e66..a5ec09e7 100644 --- a/ios/Classes/SwiftFlutterForegroundTaskPlugin.swift +++ b/ios/Classes/SwiftFlutterForegroundTaskPlugin.swift @@ -2,7 +2,7 @@ import Flutter import UIKit import BackgroundTasks -public class SwiftFlutterForegroundTaskPlugin: NSObject, FlutterPlugin { +public class SwiftFlutterForegroundTaskPlugin: NSObject, FlutterPlugin, FlutterSceneLifeCycleDelegate { // ====================== Plugin ====================== static private(set) var registerPlugins: FlutterPluginRegistrantCallback? = nil @@ -16,11 +16,20 @@ public class SwiftFlutterForegroundTaskPlugin: NSObject, FlutterPlugin { instance.initServices() instance.initChannels(registrar.messenger()) registrar.addApplicationDelegate(instance) + registrar.addSceneDelegate(instance) } public static func setPluginRegistrantCallback(_ callback: @escaping FlutterPluginRegistrantCallback) { registerPlugins = callback } + + @objc public static func registerAppRefreshForBackgroundLaunch() { + if #available(iOS 13.0, *) { + let permitted = Bundle.main.object(forInfoDictionaryKey: "BGTaskSchedulerPermittedIdentifiers") as? [String] ?? [] + guard permitted.contains(refreshIdentifier) else { return } + registerAppRefresh() + } + } public static func addTaskLifecycleListener(_ listener: FlutterForegroundTaskLifecycleListener) { BackgroundService.sharedInstance.addTaskLifecycleListener(listener) @@ -115,6 +124,12 @@ public class SwiftFlutterForegroundTaskPlugin: NSObject, FlutterPlugin { sleep(5) } + // ================ Scene Lifecycle =================== + @available(iOS 13.0, *) + public func sceneDidEnterBackground(_ scene: UIScene) { + SwiftFlutterForegroundTaskPlugin.scheduleAppRefresh() + } + // ================= Service Delegate ================= @available(iOS 10.0, *) public func userNotificationCenter(_ center: UNUserNotificationCenter, @@ -132,9 +147,12 @@ public class SwiftFlutterForegroundTaskPlugin: NSObject, FlutterPlugin { // ============== Background App Refresh ============== public static var refreshIdentifier: String = "com.pravera.flutter_foreground_task.refresh" + private static var isBgTaskRegistered: Bool = false @available(iOS 13.0, *) private static func registerAppRefresh() { + guard !isBgTaskRegistered else { return } + isBgTaskRegistered = true BGTaskScheduler.shared.register(forTaskWithIdentifier: refreshIdentifier, using: nil) { task in handleAppRefresh(task: task as! BGAppRefreshTask) } diff --git a/pubspec.yaml b/pubspec.yaml index 606ceaaa..f95bf65e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -5,7 +5,7 @@ homepage: https://github.com/Dev-hwang/flutter_foreground_task environment: sdk: ^3.4.0 - flutter: ">=3.22.0" + flutter: ">=3.38.0" dependencies: flutter: