1// Copyright 2018-present 650 Industries. All rights reserved. 2 3#import <ABI47_0_0ExpoModulesCore/ABI47_0_0EXDefines.h> 4#import <ABI47_0_0ExpoModulesCore/ABI47_0_0EXTaskManagerInterface.h> 5 6#import <ABI47_0_0EXBackgroundFetch/ABI47_0_0EXBackgroundFetch.h> 7#import <ABI47_0_0EXBackgroundFetch/ABI47_0_0EXBackgroundFetchTaskConsumer.h> 8 9@interface ABI47_0_0EXBackgroundFetch () 10 11@property (nonatomic, weak) id<ABI47_0_0EXTaskManagerInterface> taskManager; 12 13@end 14 15@implementation ABI47_0_0EXBackgroundFetch 16 17ABI47_0_0EX_EXPORT_MODULE(ExpoBackgroundFetch); 18 19- (void)setModuleRegistry:(ABI47_0_0EXModuleRegistry *)moduleRegistry 20{ 21 _taskManager = [moduleRegistry getModuleImplementingProtocol:@protocol(ABI47_0_0EXTaskManagerInterface)]; 22} 23 24ABI47_0_0EX_EXPORT_METHOD_AS(getStatusAsync, 25 getStatus:(ABI47_0_0EXPromiseResolveBlock)resolve 26 reject:(ABI47_0_0EXPromiseRejectBlock)reject) 27{ 28 dispatch_async(dispatch_get_main_queue(), ^{ 29 resolve(@([self _getStatus])); 30 }); 31} 32 33ABI47_0_0EX_EXPORT_METHOD_AS(setMinimumIntervalAsync, 34 setMinimumInterval:(nonnull NSNumber *)minimumInterval 35 resolve:(ABI47_0_0EXPromiseResolveBlock)resolve 36 reject:(ABI47_0_0EXPromiseRejectBlock)reject) 37{ 38 dispatch_async(dispatch_get_main_queue(), ^{ 39 NSTimeInterval timeInterval = [minimumInterval doubleValue]; 40 [[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:timeInterval]; 41 resolve(nil); 42 }); 43} 44 45ABI47_0_0EX_EXPORT_METHOD_AS(registerTaskAsync, 46 registerTaskWithName:(nonnull NSString *)taskName 47 options:(nullable NSDictionary *)options 48 resolve:(ABI47_0_0EXPromiseResolveBlock)resolve 49 reject:(ABI47_0_0EXPromiseRejectBlock)reject) 50{ 51 if (![_taskManager hasBackgroundModeEnabled:@"fetch"]) { 52 return reject( 53 @"E_BACKGROUND_FETCH_DISABLED", 54 @"Background Fetch has not been configured. To enable it, add `fetch` to `UIBackgroundModes` in the application's Info.plist file.", 55 nil 56 ); 57 } 58 59 @try { 60 [_taskManager registerTaskWithName:taskName 61 consumer:ABI47_0_0EXBackgroundFetchTaskConsumer.class 62 options:options]; 63 } 64 @catch (NSException *e) { 65 return reject(e.name, e.reason, nil); 66 } 67 resolve(nil); 68} 69 70ABI47_0_0EX_EXPORT_METHOD_AS(unregisterTaskAsync, 71 unregisterTaskWithName:(nonnull NSString *)taskName 72 resolve:(ABI47_0_0EXPromiseResolveBlock)resolve 73 reject:(ABI47_0_0EXPromiseRejectBlock)reject) 74{ 75 @try { 76 [_taskManager unregisterTaskWithName:taskName consumerClass:[ABI47_0_0EXBackgroundFetchTaskConsumer class]]; 77 } @catch (NSException *e) { 78 return reject(e.name, e.reason, nil); 79 } 80 resolve(nil); 81} 82 83# pragma mark - helpers 84 85- (ABI47_0_0EXBackgroundFetchStatus)_getStatus 86{ 87 UIBackgroundRefreshStatus refreshStatus = [[UIApplication sharedApplication] backgroundRefreshStatus]; 88 89 switch (refreshStatus) { 90 case UIBackgroundRefreshStatusRestricted: 91 return ABI47_0_0EXBackgroundFetchStatusRestricted; 92 case UIBackgroundRefreshStatusDenied: 93 return ABI47_0_0EXBackgroundFetchStatusDenied; 94 case UIBackgroundRefreshStatusAvailable: 95 return ABI47_0_0EXBackgroundFetchStatusAvailable; 96 } 97} 98 99@end 100