diff --git a/.github/workflows/appstore.yml b/.github/workflows/appstore.yml
index 45aa1ef8..9a156c53 100644
--- a/.github/workflows/appstore.yml
+++ b/.github/workflows/appstore.yml
@@ -109,6 +109,8 @@ jobs:
google_service_info_path="Application/App/Sources/Resource/GoogleService-Info.plist"
dsym_zip_path="$(find fastlane/appstore_build -maxdepth 1 -name '*.dSYM.zip' -print -quit)"
+ dsym_manifest_path="fastlane/appstore_build/dsym-uuids.txt"
+ dsym_extract_path="$RUNNER_TEMP/appstore-dsym"
upload_symbols_path="$(find "$HOME/Library/Developer/Xcode/DerivedData" "$HOME/Library/Developer/Xcode/SourcePackages" "$GITHUB_WORKSPACE" -path '*/SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/upload-symbols' -type f -print -quit 2>/dev/null || true)"
if [ ! -f "$google_service_info_path" ]; then
@@ -126,6 +128,18 @@ jobs:
exit 1
fi
+ mkdir -p "$dsym_extract_path"
+ unzip -q "$dsym_zip_path" -d "$dsym_extract_path"
+
+ while IFS= read -r dsym_path; do
+ dwarfdump --uuid "$dsym_path"
+ done < <(find "$dsym_extract_path" -type d -name '*.dSYM' | sort) | tee "$dsym_manifest_path"
+
+ if [ ! -s "$dsym_manifest_path" ]; then
+ echo "Missing dSYM UUID manifest at $dsym_manifest_path" >&2
+ exit 1
+ fi
+
"$upload_symbols_path" -gsp "$google_service_info_path" -p ios "$dsym_zip_path"
- name: Upload App Store build log
@@ -141,7 +155,9 @@ jobs:
uses: actions/upload-artifact@v6
with:
name: appstore-dsym
- path: fastlane/appstore_build/*.dSYM.zip
+ path: |
+ fastlane/appstore_build/*.dSYM.zip
+ fastlane/appstore_build/dsym-uuids.txt
if-no-files-found: warn
- name: Skip App Store Upload
diff --git a/.github/workflows/testflight.yml b/.github/workflows/testflight.yml
index 43b23d26..af624833 100644
--- a/.github/workflows/testflight.yml
+++ b/.github/workflows/testflight.yml
@@ -110,6 +110,8 @@ jobs:
google_service_info_path="Application/App/Sources/Resource/GoogleService-Info.plist"
dsym_zip_path="$(find fastlane/testflight_build -maxdepth 1 -name '*.dSYM.zip' -print -quit)"
+ dsym_manifest_path="fastlane/testflight_build/dsym-uuids.txt"
+ dsym_extract_path="$RUNNER_TEMP/testflight-dsym"
upload_symbols_path="$(find "$HOME/Library/Developer/Xcode/DerivedData" "$HOME/Library/Developer/Xcode/SourcePackages" "$GITHUB_WORKSPACE" -path '*/SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/upload-symbols' -type f -print -quit 2>/dev/null || true)"
if [ ! -f "$google_service_info_path" ]; then
@@ -127,6 +129,18 @@ jobs:
exit 1
fi
+ mkdir -p "$dsym_extract_path"
+ unzip -q "$dsym_zip_path" -d "$dsym_extract_path"
+
+ while IFS= read -r dsym_path; do
+ dwarfdump --uuid "$dsym_path"
+ done < <(find "$dsym_extract_path" -type d -name '*.dSYM' | sort) | tee "$dsym_manifest_path"
+
+ if [ ! -s "$dsym_manifest_path" ]; then
+ echo "Missing dSYM UUID manifest at $dsym_manifest_path" >&2
+ exit 1
+ fi
+
"$upload_symbols_path" -gsp "$google_service_info_path" -p ios "$dsym_zip_path"
- name: Upload TestFlight build log
@@ -142,7 +156,9 @@ jobs:
uses: actions/upload-artifact@v6
with:
name: testflight-dsym
- path: fastlane/testflight_build/*.dSYM.zip
+ path: |
+ fastlane/testflight_build/*.dSYM.zip
+ fastlane/testflight_build/dsym-uuids.txt
if-no-files-found: warn
- name: Skip TestFlight Upload
diff --git a/Application/App/Project.swift b/Application/App/Project.swift
index db67b630..9c305624 100644
--- a/Application/App/Project.swift
+++ b/Application/App/Project.swift
@@ -46,26 +46,23 @@ let project = Project(
base: [
"ASSETCATALOG_COMPILER_APPICON_NAME": "AppIcon",
"CODE_SIGN_STYLE": "Automatic",
+ "CRASHLYTICS_COLLECTION_ENABLED": "0",
"ENABLE_USER_SCRIPT_SANDBOXING": "NO",
+ "INFOPLIST_PREPROCESS": "YES",
+ "INFOPLIST_PREPROCESSOR_DEFINITIONS": "$(inherited) CRASHLYTICS_COLLECTION_ENABLED=$(CRASHLYTICS_COLLECTION_ENABLED)",
"PRODUCT_MODULE_NAME": "App",
],
debug: [
"APS_ENVIRONMENT": "development",
- "DEBUG_INFORMATION_FORMAT": "dwarf",
"FIRESTORE_DATABASE_ID": "staging",
- "INFOPLIST_KEY_FirebaseCrashlyticsCollectionEnabled": "NO",
],
staging: [
"APS_ENVIRONMENT": "production",
- "DEBUG_INFORMATION_FORMAT": "dwarf-with-dsym",
"FIRESTORE_DATABASE_ID": "staging",
- "INFOPLIST_KEY_FirebaseCrashlyticsCollectionEnabled": "YES",
],
release: [
"APS_ENVIRONMENT": "production",
- "DEBUG_INFORMATION_FORMAT": "dwarf-with-dsym",
"FIRESTORE_DATABASE_ID": "prod",
- "INFOPLIST_KEY_FirebaseCrashlyticsCollectionEnabled": "YES",
]
)
),
diff --git a/Application/App/Sources/Resource/Info.plist b/Application/App/Sources/Resource/Info.plist
index 27a437a2..84f1d58e 100644
--- a/Application/App/Sources/Resource/Info.plist
+++ b/Application/App/Sources/Resource/Info.plist
@@ -38,6 +38,12 @@
FirebaseAutomaticScreenReportingEnabled
+ FirebaseCrashlyticsCollectionEnabled
+#if CRASHLYTICS_COLLECTION_ENABLED
+
+#else
+
+#endif
FIRESTORE_DATABASE_ID
$(FIRESTORE_DATABASE_ID)
FUNCTION_API_BASE_URL
diff --git a/Application/Infra/Sources/Service/FirebaseAppServiceImpl.swift b/Application/Infra/Sources/Service/FirebaseAppServiceImpl.swift
index 3bb0473a..59e3f5b0 100644
--- a/Application/Infra/Sources/Service/FirebaseAppServiceImpl.swift
+++ b/Application/Infra/Sources/Service/FirebaseAppServiceImpl.swift
@@ -6,7 +6,6 @@
//
import Data
-import FirebaseCrashlytics
import FirebaseCore
final class FirebaseAppServiceImpl: FirebaseAppService {
@@ -16,15 +15,6 @@ final class FirebaseAppServiceImpl: FirebaseAppService {
guard !Self.isConfigured else { return }
FirebaseApp.configure()
- enableCrashlyticsCollectionIfNeeded()
Self.isConfigured = true
}
}
-
-private extension FirebaseAppServiceImpl {
- func enableCrashlyticsCollectionIfNeeded() {
- #if !DEBUG
- Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(true)
- #endif
- }
-}
diff --git a/Application/Presentation/Project.swift b/Application/Presentation/Project.swift
index fe45b5c8..7ae67a27 100644
--- a/Application/Presentation/Project.swift
+++ b/Application/Presentation/Project.swift
@@ -10,15 +10,6 @@ let frameworkBuildSettings = Settings.devlog(
base: [
"ENABLE_USER_SCRIPT_SANDBOXING": "NO",
"OTHER_LIBTOOLFLAGS": "$(inherited) -no_warning_for_no_symbols"
- ],
- debug: [
- "DEBUG_INFORMATION_FORMAT": "dwarf"
- ],
- staging: [
- "DEBUG_INFORMATION_FORMAT": "dwarf-with-dsym"
- ],
- release: [
- "DEBUG_INFORMATION_FORMAT": "dwarf-with-dsym"
]
)
diff --git a/Tuist/ProjectDescriptionHelpers/Project+Settings.swift b/Tuist/ProjectDescriptionHelpers/Project+Settings.swift
index cd1f054b..67181902 100644
--- a/Tuist/ProjectDescriptionHelpers/Project+Settings.swift
+++ b/Tuist/ProjectDescriptionHelpers/Project+Settings.swift
@@ -15,6 +15,7 @@ public extension Settings {
) -> Settings {
var commonBase: SettingsDictionary = [
"CURRENT_PROJECT_VERSION": "1",
+ "DEBUG_INFORMATION_FORMAT": "dwarf",
"INFOPLIST_KEY_CFBundleShortVersionString": "$(MARKETING_VERSION)",
"INFOPLIST_KEY_CFBundleVersion": "$(CURRENT_PROJECT_VERSION)",
"SWIFT_VERSION": "5.0",
diff --git a/Tuist/ProjectDescriptionHelpers/Project+Templates.swift b/Tuist/ProjectDescriptionHelpers/Project+Templates.swift
index d5470197..f6a53760 100644
--- a/Tuist/ProjectDescriptionHelpers/Project+Templates.swift
+++ b/Tuist/ProjectDescriptionHelpers/Project+Templates.swift
@@ -30,15 +30,6 @@ public extension Project {
versionXcconfigPath: versionXcconfigPath,
base: [
"ENABLE_USER_SCRIPT_SANDBOXING": "NO",
- ],
- debug: [
- "DEBUG_INFORMATION_FORMAT": "dwarf",
- ],
- staging: [
- "DEBUG_INFORMATION_FORMAT": "dwarf-with-dsym",
- ],
- release: [
- "DEBUG_INFORMATION_FORMAT": "dwarf-with-dsym",
]
)
),
diff --git a/fastlane/Fastfile b/fastlane/Fastfile
index 45905cb6..c9061927 100644
--- a/fastlane/Fastfile
+++ b/fastlane/Fastfile
@@ -142,6 +142,19 @@ platform :ios do
end
UI.message("Verified FUNCTION_API_BASE_URL=#{actual_function_api_base_url}")
+
+ actual_crashlytics_collection_enabled = sh(
+ "/usr/libexec/PlistBuddy -c 'Print :FirebaseCrashlyticsCollectionEnabled' #{Shellwords.escape(plist_path)}",
+ log: false
+ ).strip
+
+ if actual_crashlytics_collection_enabled != "true"
+ UI.user_error!(
+ "Unexpected FirebaseCrashlyticsCollectionEnabled: expected true, got #{actual_crashlytics_collection_enabled}"
+ )
+ end
+
+ UI.message("Verified FirebaseCrashlyticsCollectionEnabled=#{actual_crashlytics_collection_enabled}")
end
end
@@ -240,7 +253,7 @@ platform :ios do
output_directory: output_directory,
output_name: "#{APP_PRODUCT_NAME}.ipa",
include_symbols: true,
- xcargs: "-skipPackagePluginValidation -skipMacroValidation"
+ xcargs: "CRASHLYTICS_COLLECTION_ENABLED=1 DEBUG_INFORMATION_FORMAT=dwarf-with-dsym -skipPackagePluginValidation -skipMacroValidation"
)
ipa_output_path = lane_context[SharedValues::IPA_OUTPUT_PATH].to_s