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