diff --git a/analytics/src/analytics_android.cc b/analytics/src/analytics_android.cc index a2825a2b7..8d3289e4d 100644 --- a/analytics/src/analytics_android.cc +++ b/analytics/src/analytics_android.cc @@ -627,6 +627,7 @@ void SetDefaultEventParameters( return; } + bool any_parameter_added = false; for (const auto& pair : default_parameters) { const Variant& value = pair.second; const char* key_cstr = pair.first.c_str(); @@ -648,6 +649,8 @@ void SetDefaultEventParameters( LogError( "SetDefaultEventParameters: Failed to put null string for key: %s", key_cstr); + } else { + any_parameter_added = true; } env->DeleteLocalRef(key_jstring); } else if (value.is_string() || value.is_int64() || value.is_double() || @@ -655,7 +658,9 @@ void SetDefaultEventParameters( // AddVariantToBundle handles these types and their JNI conversions. // It also logs if an individual AddToBundle within it fails or if a type // is unsupported by it. - if (!AddVariantToBundle(env, bundle, key_cstr, value)) { + if (AddVariantToBundle(env, bundle, key_cstr, value)) { + any_parameter_added = true; + } else { // This specific log gives context that the failure happened during // SetDefaultEventParameters for a type that was expected to be // supported by AddVariantToBundle. @@ -681,6 +686,14 @@ void SetDefaultEventParameters( } } + if (!any_parameter_added) { + LogDebug( + "SetDefaultEventParameters: No valid parameters were processed, " + "skipping native call to avoid clearing existing parameters."); + env->DeleteLocalRef(bundle); + return; + } + env->CallVoidMethod( g_analytics_class_instance, analytics::GetMethodId(analytics::kSetDefaultEventParameters), bundle); diff --git a/analytics/src/analytics_ios.mm b/analytics/src/analytics_ios.mm index 9d1982b17..df413b235 100644 --- a/analytics/src/analytics_ios.mm +++ b/analytics/src/analytics_ios.mm @@ -403,6 +403,15 @@ void SetDefaultEventParameters(const std::map& default_par pair.first.c_str(), Variant::TypeName(value.type())); } } + // If ns_default_parameters is empty at this point, it means all input + // parameters were invalid or the input map itself was empty. + // In this case, we should not call the native SDK, as passing an empty + // NSDictionary might clear existing parameters, which is not the intent + // if all inputs were simply invalid. + if ([ns_default_parameters count] == 0) { + LogDebug("SetDefaultEventParameters: No valid parameters to set, skipping native call."); + return; + } [FIRAnalytics setDefaultEventParameters:ns_default_parameters]; }