const { withAppDelegate } = require("@expo/config-plugins"); function withRNBackgroundDownloader(expoConfig) { return withAppDelegate(expoConfig, async (appDelegateConfig) => { const { modResults: appDelegate } = appDelegateConfig; const appDelegateLines = appDelegate.contents.split("\n"); // Define the code to be added to AppDelegate.mm const backgroundDownloaderImport = "#import // Required by react-native-background-downloader. Generated by expoPlugins/withRNBackgroundDownloader.js"; const backgroundDownloaderDelegate = `\n// Delegate method required by react-native-background-downloader. Generated by expoPlugins/withRNBackgroundDownloader.js - (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)(void))completionHandler { [RNBackgroundDownloader setCompletionHandlerWithIdentifier:identifier completionHandler:completionHandler]; }`; // Find the index of the AppDelegate import statement const importIndex = appDelegateLines.findIndex((line) => /^#import "AppDelegate.h"/.test(line), ); // Find the index of the last line before the @end statement const endStatementIndex = appDelegateLines.findIndex((line) => /@end/.test(line), ); // Insert the import statement if it's not already present if (!appDelegate.contents.includes(backgroundDownloaderImport)) { appDelegateLines.splice(importIndex + 1, 0, backgroundDownloaderImport); } // Insert the delegate method above the @end statement if (!appDelegate.contents.includes(backgroundDownloaderDelegate)) { appDelegateLines.splice( endStatementIndex, 0, backgroundDownloaderDelegate, ); } // Update the contents of the AppDelegate file appDelegate.contents = appDelegateLines.join("\n"); return appDelegateConfig; }); } module.exports = withRNBackgroundDownloader;