A library for generating native app code from JavaScript config through Expo config plugins
Comprehensive configuration utilities for iOS platform development including Info.plist manipulation, entitlements management, Xcode project configuration, and native file handling. The IOSConfig namespace provides fine-grained control over iOS project files.
Utilities for getting paths to iOS project files.
namespace IOSConfig.Paths {
function getInfoPlistPath(projectRoot: string): string;
function getEntitlementsPath(projectRoot: string): string | null;
}Usage:
const plistPath = IOSConfig.Paths.getInfoPlistPath(projectRoot);
const entitlementsPath = IOSConfig.Paths.getEntitlementsPath(projectRoot);
console.log('Info.plist path:', plistPath);
console.log('Entitlements path:', entitlementsPath);Utilities for managing app entitlements and capabilities.
namespace IOSConfig.Entitlements {
function setAssociatedDomains(
entitlements: Plist,
domains: string[]
): Plist;
}Usage:
const entitlementsPath = IOSConfig.Entitlements.getEntitlementsPath(projectRoot);
if (entitlementsPath) {
const entitlements = await readPlistAsync(entitlementsPath);
// Enable associated domains
IOSConfig.Entitlements.setCustomEntitlement(
entitlements,
"com.apple.developer.associated-domains",
["applinks:example.com", "webcredentials:example.com"]
);
await writePlistAsync(entitlementsPath, entitlements);
}Utilities for locating and working with iOS project file paths.
namespace IOSConfig.Paths {
function getInfoPlistPath(projectRoot: string): string;
function getAppDelegateFilePath(projectRoot: string): string;
function getPodfilePath(projectRoot: string): string;
function getXcodeProjectPath(projectRoot: string): string;
function findXcodeProject(projectRoot: string): { name: string; path: string };
function getAllXcodeProjectPaths(projectRoot: string): string[];
function getAllPBXProjectPaths(projectRoot: string): string[];
interface AppDelegateProjectFile {
path: string;
contents: string;
language: "objc" | "swift";
}
}Utilities for managing bundle identifier configuration.
namespace IOSConfig.BundleIdentifier {
function getBundleIdentifier(infoPlist: InfoPlist): string | null;
function setBundleIdentifier(infoPlist: InfoPlist, bundleId: string): InfoPlist;
function updateIdFromConfig(config: ExpoConfig, infoPlist: InfoPlist): InfoPlist;
}Utilities for managing app name configuration.
namespace IOSConfig.Name {
function setDisplayName(infoPlist: InfoPlist, displayName: string): InfoPlist;
function getDisplayName(infoPlist: InfoPlist): string | null;
function setBundleName(infoPlist: InfoPlist, bundleName: string): InfoPlist;
function getBundleName(infoPlist: InfoPlist): string | null;
}Utilities for managing app version configuration.
namespace IOSConfig.Version {
function getVersion(infoPlist: InfoPlist): string | null;
function setVersion(infoPlist: InfoPlist, version: string): InfoPlist;
function getBuildNumber(infoPlist: InfoPlist): string | null;
function setBuildNumber(infoPlist: InfoPlist, buildNumber: string): InfoPlist;
}Utilities for managing supported device families.
namespace IOSConfig.DeviceFamily {
function getSupportsTablet(infoPlist: InfoPlist): boolean;
function setSupportsTablet(infoPlist: InfoPlist, supportsTablet: boolean): InfoPlist;
function getDeviceFamily(infoPlist: InfoPlist): number[];
}Utilities for managing supported interface orientations.
namespace IOSConfig.Orientation {
function getOrientation(infoPlist: InfoPlist): {
UIInterfaceOrientationPortrait?: boolean;
UIInterfaceOrientationPortraitUpsideDown?: boolean;
UIInterfaceOrientationLandscapeLeft?: boolean;
UIInterfaceOrientationLandscapeRight?: boolean;
};
function setOrientation(
infoPlist: InfoPlist,
orientations: {
portrait?: boolean;
portraitUpsideDown?: boolean;
landscapeLeft?: boolean;
landscapeRight?: boolean;
}
): InfoPlist;
}Utilities for managing full screen requirements.
namespace IOSConfig.RequiresFullScreen {
function setRequiresFullScreen(infoPlist: InfoPlist, requiresFullScreen: boolean): InfoPlist;
function getRequiresFullScreen(infoPlist: InfoPlist): boolean;
}Utilities for managing URL schemes and deep linking.
namespace IOSConfig.Scheme {
function getSchemesFromPlist(infoPlist: InfoPlist): string[];
function setSchemesInPlist(infoPlist: InfoPlist, schemes: string[]): InfoPlist;
function appendScheme(infoPlist: InfoPlist, scheme: string): InfoPlist;
function removeScheme(infoPlist: InfoPlist, scheme: string): InfoPlist;
function withScheme(config: ExpoConfig): ExpoConfig;
}Usage:
// Add custom URL scheme
IOSConfig.Scheme.appendScheme(infoPlist, "myapp");
// Add multiple schemes
IOSConfig.Scheme.setSchemesInPlist(infoPlist, ["myapp", "mycustomscheme"]);Utilities for working with Xcode targets and build configurations.
namespace IOSConfig.Target {
function findFirstNativeTarget(project: XcodeProject): any;
function getNativeTargets(project: XcodeProject): any[];
function getXCBuildConfigurationFromPbxproj(
project: XcodeProject,
configName: string
): any;
function getProductName(project: XcodeProject): string;
}Utilities for manipulating Xcode project structure.
namespace IOSConfig.XcodeProjectFile {
function resolvePathOrProject(projectRootOrProject: string | XcodeProject): {
project: XcodeProject;
projectRoot: string;
};
function ensureGroupRecursively(
project: XcodeProject,
groupPath: string
): any;
function addFileToGroup(
project: XcodeProject,
filePath: string,
groupPath: string
): XcodeProject;
}Advanced Xcode project manipulation utilities.
namespace IOSConfig.XcodeUtils {
function getPbxproj(projectRoot: string): XcodeProject;
function writePbxproj(projectRoot: string, project: XcodeProject): void;
function getXCConfigurationListEntries(project: XcodeProject): any[];
function getBuildConfigurationForId(project: XcodeProject, configId: string): any;
}Utilities for managing iOS build properties and settings.
namespace IOSConfig.BuildProperties {
function withBuildProperties(config: ExpoConfig): ExpoConfig;
}Utilities for managing Xcode build schemes.
namespace IOSConfig.BuildScheme {
function getSchemePaths(projectRoot: string): string[];
function setSchemeConfiguration(
schemePath: string,
configuration: string
): void;
function createBuildSchemeAsync(
projectRoot: string,
options: {
name: string;
buildConfiguration: string;
}
): Promise<void>;
}Utilities for managing development team configuration.
namespace IOSConfig.DevelopmentTeam {
function setDevelopmentTeam(project: XcodeProject, teamId: string): XcodeProject;
function getDevelopmentTeam(project: XcodeProject): string | null;
}Utilities for managing provisioning profiles.
namespace IOSConfig.ProvisioningProfile {
function setProvisioningProfile(
project: XcodeProject,
profileName: string
): XcodeProject;
function getProvisioningProfile(project: XcodeProject): string | null;
}Utilities for managing app privacy information.
namespace IOSConfig.PrivacyInfo {
function setPrivacyInfo(
infoPlist: InfoPlist,
privacyInfo: {
NSLocationWhenInUseUsageDescription?: string;
NSLocationAlwaysAndWhenInUseUsageDescription?: string;
NSCameraUsageDescription?: string;
NSMicrophoneUsageDescription?: string;
NSPhotoLibraryUsageDescription?: string;
NSContactsUsageDescription?: string;
}
): InfoPlist;
function withPrivacyInfo(config: ExpoConfig): ExpoConfig;
}Utilities for managing encryption exemption flag.
namespace IOSConfig.UsesNonExemptEncryption {
function setUsesNonExemptEncryption(
infoPlist: InfoPlist,
usesEncryption: boolean
): InfoPlist;
function getUsesNonExemptEncryption(infoPlist: InfoPlist): boolean;
}Utilities for Google SDK integration.
namespace IOSConfig.Google {
function setGoogleMapsApiKey(infoPlist: InfoPlist, apiKey: string): InfoPlist;
function setGoogleSignIn(infoPlist: InfoPlist, config: {
clientId: string;
reversedClientId: string;
}): InfoPlist;
}Utilities for Maps framework integration.
namespace IOSConfig.Maps {
function setMapsApiKey(infoPlist: InfoPlist, apiKey: string): InfoPlist;
}Utilities for managing bitcode settings.
namespace IOSConfig.Bitcode {
function setBitcodeEnabled(project: XcodeProject, enabled: boolean): XcodeProject;
function isBitcodeEnabled(project: XcodeProject): boolean;
}Utilities for Expo Updates configuration.
namespace IOSConfig.Updates {
function withUpdates(config: ExpoConfig): ExpoConfig;
function setUpdatesConfig(
expoPlist: Plist,
updatesConfig: {
updateUrl?: string;
releaseChannel?: string;
runtimeVersion?: string;
}
): Plist;
}import { IOSConfig } from "@expo/config-plugins";
async function configureiOSApp(projectRoot: string, config: {
appName: string;
bundleId: string;
version: string;
buildNumber: string;
urlSchemes: string[];
privacyDescriptions: {
camera?: string;
location?: string;
microphone?: string;
};
}) {
// Get Info.plist path and read it
const plistPath = IOSConfig.InfoPlist.getInfoPlistPath(projectRoot);
const infoPlist = await IOSConfig.InfoPlist.readInfoPlistAsync(plistPath);
// Set basic app info
IOSConfig.Name.setDisplayName(infoPlist, config.appName);
IOSConfig.BundleIdentifier.setBundleIdentifier(infoPlist, config.bundleId);
IOSConfig.Version.setVersion(infoPlist, config.version);
IOSConfig.Version.setBuildNumber(infoPlist, config.buildNumber);
// Set URL schemes
IOSConfig.Scheme.setSchemesInPlist(infoPlist, config.urlSchemes);
// Set privacy descriptions
if (config.privacyDescriptions.camera) {
infoPlist.NSCameraUsageDescription = config.privacyDescriptions.camera;
}
if (config.privacyDescriptions.location) {
infoPlist.NSLocationWhenInUseUsageDescription = config.privacyDescriptions.location;
}
if (config.privacyDescriptions.microphone) {
infoPlist.NSMicrophoneUsageDescription = config.privacyDescriptions.microphone;
}
// Write Info.plist back
await IOSConfig.InfoPlist.writeInfoPlistAsync(plistPath, infoPlist);
// Configure Xcode project
const project = IOSConfig.XcodeUtils.getPbxproj(projectRoot);
// Set development team (if available)
IOSConfig.DevelopmentTeam.setDevelopmentTeam(project, "YOUR_TEAM_ID");
// Write project back
IOSConfig.XcodeUtils.writePbxproj(projectRoot, project);
}async function advancedXcodeSetup(projectRoot: string) {
const project = IOSConfig.XcodeUtils.getPbxproj(projectRoot);
// Find native target
const target = IOSConfig.Target.findFirstNativeTarget(project);
// Get build configurations
const configurations = IOSConfig.XcodeUtils.getXCConfigurationListEntries(project);
configurations.forEach(config => {
if (config.buildSettings) {
// Set deployment target
config.buildSettings.IPHONEOS_DEPLOYMENT_TARGET = "12.0";
// Enable bitcode
config.buildSettings.ENABLE_BITCODE = "YES";
// Add custom build flags
config.buildSettings.OTHER_CFLAGS = [
"$(inherited)",
"-DCUSTOM_FLAG=1"
];
}
});
// Add framework
IOSConfig.XcodeProjectFile.addFileToGroup(
project,
"Frameworks/CustomFramework.framework",
"Frameworks"
);
IOSConfig.XcodeUtils.writePbxproj(projectRoot, project);
}tessl i tessl/npm-expo--config-plugins@11.0.0docs
evals
scenario-1
scenario-2
scenario-3
scenario-4
scenario-5
scenario-6
scenario-7
scenario-8
scenario-9
scenario-10