Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions ios/Classes/FlutterForegroundTaskPlugin.m
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,12 @@ + (void)setPluginRegistrantCallback:(FlutterPluginRegistrantCallback)callback {
[SwiftFlutterForegroundTaskPlugin setPluginRegistrantCallback:callback];
}
@end

@interface FlutterForegroundTaskEarlyRegistration : NSObject
@end

@implementation FlutterForegroundTaskEarlyRegistration
+ (void)load {
[SwiftFlutterForegroundTaskPlugin registerAppRefreshForBackgroundLaunch];
}
@end
20 changes: 19 additions & 1 deletion ios/Classes/SwiftFlutterForegroundTaskPlugin.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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)
Expand Down Expand Up @@ -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,
Expand All @@ -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)
}
Expand Down
2 changes: 1 addition & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down