1 import ExpoModulesCore
2 
3 public class BackgroundFetchModule: Module {
4   private var taskManager: EXTaskManagerInterface?
5 
definitionnull6   public func definition() -> ModuleDefinition {
7     Name("ExpoBackgroundFetch")
8 
9     OnCreate {
10       taskManager = appContext?.legacyModule(implementing: EXTaskManagerInterface.self)
11     }
12 
13     AsyncFunction("getStatusAsync") {
14       return getStatus().rawValue
15     }.runOnQueue(.main)
16 
17     AsyncFunction("setMinimumIntervalAsync") { (minimumInterval: Double) in
18       let timeInterval = TimeInterval(minimumInterval)
19       UIApplication.shared.setMinimumBackgroundFetchInterval(timeInterval)
20     }.runOnQueue(.main)
21 
22     AsyncFunction("registerTaskAsync") { (name: String, options: [String: Any]) in
23       guard let taskManager else {
24         throw TaskManagerNotFound()
25       }
26 
27       if !taskManager.hasBackgroundModeEnabled("fetch") {
28         throw BackgroundFetchDisabled()
29       }
30 
31       taskManager.registerTask(withName: name, consumer: BackgroundFetchTaskConsumer.self, options: options)
32     }
33 
34     AsyncFunction("unregisterTaskAsync") { (name: String) in
35       taskManager?.unregisterTask(withName: name, consumerClass: BackgroundFetchTaskConsumer.self)
36     }
37   }
38 
getStatusnull39   private func getStatus() -> BackgroundFetchStatus {
40     switch UIApplication.shared.backgroundRefreshStatus {
41     case .restricted:
42       return .restricted
43     case .available:
44       return .available
45     case .denied:
46       return .denied
47     }
48   }
49 }
50