getInfoPlist method
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;
}