1 | import ExpoModulesCore
|
2 |
|
3 | class BackgroundFetchTaskConsumer: NSObject, EXTaskConsumerInterface {
|
4 | var task: EXTaskInterface?
|
5 |
|
6 | static func supportsLaunchReason(_ launchReason: EXTaskLaunchReason) -> Bool {
|
7 | return launchReason == EXTaskLaunchReasonBackgroundFetch
|
8 | }
|
9 |
|
10 | func taskType() -> String {
|
11 | return "backgroundFetch"
|
12 | }
|
13 |
|
14 | func didRegisterTask(_ task: EXTaskInterface) {
|
15 | self.task = task
|
16 | updateMinimumInterval()
|
17 | }
|
18 |
|
19 | func setOptions(_ options: [AnyHashable: Any]) {
|
20 | updateMinimumInterval()
|
21 | }
|
22 |
|
23 | func didBecomeReadyToExecute(withData data: [AnyHashable: Any]?) {
|
24 | task?.execute(withData: nil, withError: nil)
|
25 | }
|
26 |
|
27 | 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 |
|
44 | 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 | }
|