// Copyright 2018-present 650 Industries. All rights reserved. #import #import #import #import @interface EXBackgroundFetch () @property (nonatomic, weak) id taskManager; @end @implementation EXBackgroundFetch UM_EXPORT_MODULE(ExpoBackgroundFetch); - (void)setModuleRegistry:(UMModuleRegistry *)moduleRegistry { _taskManager = [moduleRegistry getModuleImplementingProtocol:@protocol(UMTaskManagerInterface)]; } UM_EXPORT_METHOD_AS(getStatusAsync, getStatus:(UMPromiseResolveBlock)resolve reject:(UMPromiseRejectBlock)reject) { dispatch_async(dispatch_get_main_queue(), ^{ resolve(@([self _getStatus])); }); } UM_EXPORT_METHOD_AS(setMinimumIntervalAsync, setMinimumInterval:(nonnull NSNumber *)minimumInterval resolve:(UMPromiseResolveBlock)resolve reject:(UMPromiseRejectBlock)reject) { dispatch_async(dispatch_get_main_queue(), ^{ NSTimeInterval timeInterval = [minimumInterval doubleValue]; [[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:timeInterval]; resolve(nil); }); } UM_EXPORT_METHOD_AS(registerTaskAsync, registerTaskWithName:(nonnull NSString *)taskName options:(nullable NSDictionary *)options resolve:(UMPromiseResolveBlock)resolve reject:(UMPromiseRejectBlock)reject) { if (![_taskManager hasBackgroundModeEnabled:@"fetch"]) { return reject( @"E_BACKGROUND_FETCH_DISABLED", @"Background Fetch has not been configured. To enable it, add `fetch` to `UIBackgroundModes` in the application's Info.plist file.", nil ); } @try { [_taskManager registerTaskWithName:taskName consumer:EXBackgroundFetchTaskConsumer.class options:options]; } @catch (NSException *e) { return reject(e.name, e.reason, nil); } resolve(nil); } UM_EXPORT_METHOD_AS(unregisterTaskAsync, unregisterTaskWithName:(nonnull NSString *)taskName resolve:(UMPromiseResolveBlock)resolve reject:(UMPromiseRejectBlock)reject) { @try { [_taskManager unregisterTaskWithName:taskName consumerClass:[EXBackgroundFetchTaskConsumer class]]; } @catch (NSException *e) { return reject(e.name, e.reason, nil); } resolve(nil); } # pragma mark - helpers - (EXBackgroundFetchStatus)_getStatus { UIBackgroundRefreshStatus refreshStatus = [[UIApplication sharedApplication] backgroundRefreshStatus]; switch (refreshStatus) { case UIBackgroundRefreshStatusRestricted: return EXBackgroundFetchStatusRestricted; case UIBackgroundRefreshStatusDenied: return EXBackgroundFetchStatusDenied; case UIBackgroundRefreshStatusAvailable: return EXBackgroundFetchStatusAvailable; } } @end