getInfoPlist method

  1. @override
File? getInfoPlist()
override

Attempts to locate the Info.plist used by iOS builds. Returns null if it cannot be determined reliably.

Implementation

@override
File? getInfoPlist() {
  final iosDir = Directory('${root.path}/ios');
  if (!iosDir.existsSync()) return null;

  // 1. Check conventional location first (most common case)
  final conventional = File('${iosDir.path}/Runner/Info.plist');
  if (conventional.existsSync() && _isValidPlist(conventional)) {
    return conventional;
  }

  // 2. Parse project.pbxproj for custom INFOPLIST_FILE locations
  final pbxproj = File(
    '${iosDir.path}/Runner.xcodeproj/project.pbxproj',
  );
  if (!pbxproj.existsSync()) return null;

  final content = pbxproj.readAsStringSync();

  // Extract INFOPLIST_FILE entries
  final matches = RegExp(
    r'INFOPLIST_FILE\s*=\s*([^;]+);',
  ).allMatches(content);

  for (final match in matches) {
    var value = match.group(1)!.trim();

    // Skip variable-based paths (cannot be resolved statically)
    if (value.contains(r'$')) continue;

    value = value.replaceAll('"', '');
    final file = File('${iosDir.path}/$value');
    if (file.existsSync() && _isValidPlist(file)) return file;
  }

  return null;
}