diff --git a/lib/exceptions.dart b/lib/exceptions.dart index d4524ba..cdbbfa3 100644 --- a/lib/exceptions.dart +++ b/lib/exceptions.dart @@ -185,4 +185,9 @@ class _PackageRenameErrors { _invalidShortAppNameMessage, 34, ); + + static const baseIdentifierNotFound = _PackageRenameException( + _baseIdentifierNotFoundMessage, + 35, + ); } diff --git a/lib/messages.dart b/lib/messages.dart index f5803f5..ab8545f 100644 --- a/lib/messages.dart +++ b/lib/messages.dart @@ -209,3 +209,10 @@ const _macOSProjectFileNotFoundMessage = ''' ║ project.pbxproj not found in `macos/Runner.xcodeproj/`. ║ ╚═════════════════════════════════════════════════════════════╝ '''; + +const _baseIdentifierNotFoundMessage = ''' +╔══════════════════════════════════════════════════════════════════════════════╗ +║ No bundle identifiers found in `ios/Runner.xcodeproj/project.pbxproj`!!! ║ +║ The file may be corrupted or in an unexpected format. ║ +╚══════════════════════════════════════════════════════════════════════════════╝ +'''; diff --git a/lib/platforms/ios.dart b/lib/platforms/ios.dart index 1914109..defd1ee 100644 --- a/lib/platforms/ios.dart +++ b/lib/platforms/ios.dart @@ -107,30 +107,45 @@ void _setIOSPackageName(dynamic packageName) { } final iosProjectString = iosProjectFile.readAsStringSync(); - final newBundleIDIOSProjectString = iosProjectString - // Replaces old bundle id from - // `PRODUCT_BUNDLE_IDENTIFIER = {{BUNDLE_ID}};` - .replaceAll( - RegExp( - r'PRODUCT_BUNDLE_IDENTIFIER = ([A-Za-z0-9.-_]+)(? m.group(1)!) + .toSet(); + + if (bundleIdentifierMatches.isEmpty) { + throw _PackageRenameErrors.baseIdentifierNotFound; + } + + // Find the base identifier by counting extensions + String? baseIdentifier; + + // Build a map of identifier to extension count + final extensionCountMap = {}; + for (final identifier in bundleIdentifierMatches) { + extensionCountMap[identifier] = bundleIdentifierMatches.where((other) { + return other != identifier && other.startsWith('$identifier.'); + }).length; + } + baseIdentifier = extensionCountMap.entries + .reduce((a, b) => a.value >= b.value ? a : b) + .key; + + // Replace all occurrences + final newBundleIDIOSProjectString = iosProjectString.replaceAllMapped( RegExp( - r'PRODUCT_BUNDLE_IDENTIFIER = "([A-Za-z0-9.-_]+)\.([A-Za-z0-9.-_]+)";', + 'PRODUCT_BUNDLE_IDENTIFIER = ("?)${RegExp.escape(baseIdentifier)}(\\.[A-Za-z0-9.-]+)?("?);', ), (match) { - final extensionName = match.group(2); - return 'PRODUCT_BUNDLE_IDENTIFIER = "$packageName.$extensionName";'; + final quote = match.group(1) ?? match.group(3) ?? ''; + final extension = match.group(2) ?? ''; + + return 'PRODUCT_BUNDLE_IDENTIFIER = $quote$packageName$extension$quote;'; }, );