1 import ExpoModulesCore
2 
3 class BackgroundFetchTaskConsumer: NSObject, EXTaskConsumerInterface {
4   var task: EXTaskInterface?
5 
supportsLaunchReasonnull6   static func supportsLaunchReason(_ launchReason: EXTaskLaunchReason) -> Bool {
7     return launchReason == EXTaskLaunchReasonBackgroundFetch
8   }
9 
taskTypenull10   func taskType() -> String {
11     return "backgroundFetch"
12   }
13 
didRegisterTasknull14   func didRegisterTask(_ task: EXTaskInterface) {
15     self.task = task
16     updateMinimumInterval()
17   }
18 
setOptionsnull19   func setOptions(_ options: [AnyHashable: Any]) {
20     updateMinimumInterval()
21   }
22 
didBecomeReadyToExecutenull23   func didBecomeReadyToExecute(withData data: [AnyHashable: Any]?) {
24     task?.execute(withData: nil, withError: nil)
25   }
26 
normalizeTaskResultnull27   func normalizeTaskResult(_ result: Any?) -> UInt {
28     guard let result = result as? Int else {
29       return UIBackgroundFetchResult.noData.rawValue
30     }
31 
32     switch result {
33     case BackgroundFetchResult.newData.rawValue:
34       return UIBackgroundFetchResult.newData.rawValue
35     case BackgroundFetchResult.failed.rawValue:
36       return UIBackgroundFetchResult.failed.rawValue
37     case BackgroundFetchResult.noData.rawValue:
38       return UIBackgroundFetchResult.noData.rawValue
39     default:
40       return UIBackgroundFetchResult.noData.rawValue
41     }
42   }
43 
updateMinimumIntervalnull44   private func updateMinimumInterval() {
45     let interval = task?.options?["minimumInterval"] as? Double
46 
47     let timeInterval = {
48       if let interval {
49         return TimeInterval(interval)
50       }
51       return UIApplication.backgroundFetchIntervalMinimum
52     }()
53 
54     DispatchQueue.main.async {
55       UIApplication.shared.setMinimumBackgroundFetchInterval(timeInterval)
56     }
57   }
58 }
59