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