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);
}