From 533a3175e2bca84f37c3da4be009f4a3abee0e5a Mon Sep 17 00:00:00 2001 From: Matthew Hyndman Date: Mon, 30 May 2022 13:15:57 -0400 Subject: [PATCH] Add InitiateOnDeviceConversion method to Analytics (#961) * Add InitiateOnDeviceConversion to c++ sdk * Added release notes --- analytics/integration_test/src/integration_test.cc | 3 +++ analytics/src/analytics_android.cc | 10 ++++++++++ analytics/src/analytics_ios.mm | 9 +++++++++ analytics/src/analytics_stub.cc | 9 +++++++++ analytics/src/include/firebase/analytics.h | 11 ++++++++++- analytics/src_ios/fake/FIRAnalytics.h | 2 ++ analytics/src_ios/fake/FIRAnalytics.mm | 5 +++++ analytics/tests/analytics_test.cc | 10 ++++++++++ release_build_files/readme.md | 2 ++ 9 files changed, 60 insertions(+), 1 deletion(-) diff --git a/analytics/integration_test/src/integration_test.cc b/analytics/integration_test/src/integration_test.cc index f71b648398..f23f272a47 100644 --- a/analytics/integration_test/src/integration_test.cc +++ b/analytics/integration_test/src/integration_test.cc @@ -108,6 +108,9 @@ TEST_F(FirebaseAnalyticsTest, TestSetProperties) { firebase::analytics::kUserPropertySignUpMethod, "Google"); // Set the user ID. firebase::analytics::SetUserId("my_integration_test_user"); + // Initiate on-device conversion measurement. + firebase::analytics::InitiateOnDeviceConversionMeasurementWithEmailAddress( + "my_email@site.com"); } TEST_F(FirebaseAnalyticsTest, TestLogEvents) { diff --git a/analytics/src/analytics_android.cc b/analytics/src/analytics_android.cc index 46ee963a78..9acaea1d32 100644 --- a/analytics/src/analytics_android.cc +++ b/analytics/src/analytics_android.cc @@ -264,6 +264,16 @@ void LogEvent(const char* name, const Parameter* parameters, }); } +/// Initiates on-device conversion measurement given a user email address on iOS +/// (no-op on Android). On iOS, requires dependency +/// GoogleAppMeasurementOnDeviceConversion to be linked in, otherwise it is a +/// no-op. +void InitiateOnDeviceConversionMeasurementWithEmailAddress( + const char* email_address) { + FIREBASE_ASSERT_RETURN_VOID(internal::IsInitialized()); + // No-op on Android +} + // Set a user property to the given value. void SetUserProperty(const char* name, const char* value) { FIREBASE_ASSERT_RETURN_VOID(internal::IsInitialized()); diff --git a/analytics/src/analytics_ios.mm b/analytics/src/analytics_ios.mm index 5aa97232ee..6947fe049f 100644 --- a/analytics/src/analytics_ios.mm +++ b/analytics/src/analytics_ios.mm @@ -16,6 +16,7 @@ #import +#import "FIRAnalytics+OnDevice.h" #import "FIRAnalytics.h" #include "analytics/src/include/firebase/analytics.h" @@ -222,6 +223,14 @@ void LogEvent(const char* name, const Parameter* parameters, size_t number_of_pa [FIRAnalytics logEventWithName:@(name) parameters:parameters_dict]; } +/// Initiates on-device conversion measurement given a user email address on iOS (no-op on +/// Android). On iOS, requires dependency GoogleAppMeasurementOnDeviceConversion to be linked +/// in, otherwise it is a no-op. +void InitiateOnDeviceConversionMeasurementWithEmailAddress(const char* email_address) { + FIREBASE_ASSERT_RETURN_VOID(internal::IsInitialized()); + [FIRAnalytics initiateOnDeviceConversionMeasurementWithEmailAddress:@(email_address)]; +} + // Set a user property to the given value. void SetUserProperty(const char* name, const char* value) { FIREBASE_ASSERT_RETURN_VOID(internal::IsInitialized()); diff --git a/analytics/src/analytics_stub.cc b/analytics/src/analytics_stub.cc index cb6bd5fbcd..727789eaf3 100644 --- a/analytics/src/analytics_stub.cc +++ b/analytics/src/analytics_stub.cc @@ -92,6 +92,15 @@ void LogEvent(const char* /*name*/, const Parameter* /*parameters*/, FIREBASE_ASSERT_RETURN_VOID(internal::IsInitialized()); } +/// Initiates on-device conversion measurement given a user email address on iOS +/// (no-op on Android). On iOS, requires dependency +/// GoogleAppMeasurementOnDeviceConversion to be linked in, otherwise it is a +/// no-op. +void InitiateOnDeviceConversionMeasurementWithEmailAddress( + const char* email_address) { + FIREBASE_ASSERT_RETURN_VOID(internal::IsInitialized()); +} + // Set a user property to the given value. void SetUserProperty(const char* /*name*/, const char* /*value*/) { FIREBASE_ASSERT_RETURN_VOID(internal::IsInitialized()); diff --git a/analytics/src/include/firebase/analytics.h b/analytics/src/include/firebase/analytics.h index 223f6bc4e6..7841647b5c 100644 --- a/analytics/src/include/firebase/analytics.h +++ b/analytics/src/include/firebase/analytics.h @@ -433,6 +433,7 @@ void LogEvent(const char* name); // in the C# code. %csmethodmodifiers LogEvent "public unsafe" #endif // SWIG +// clang-format on /// @brief Log an event with associated parameters. /// @@ -456,7 +457,15 @@ void LogEvent(const char* name); /// array. void LogEvent(const char* name, const Parameter* parameters, size_t number_of_parameters); -// clang-format on + +/// Initiates on-device conversion measurement given a user email address on iOS +/// (no-op on Android). On iOS, requires dependency +/// GoogleAppMeasurementOnDeviceConversion to be linked in, otherwise it is a +/// no-op. +/// @param[in] email_address User email address. Include a domain name for all +/// email addresses (e.g. gmail.com or hotmail.co.jp). +void InitiateOnDeviceConversionMeasurementWithEmailAddress( + const char* email_address); /// @brief Set a user property to the given value. /// diff --git a/analytics/src_ios/fake/FIRAnalytics.h b/analytics/src_ios/fake/FIRAnalytics.h index 760f226a0b..dc2d79de38 100644 --- a/analytics/src_ios/fake/FIRAnalytics.h +++ b/analytics/src_ios/fake/FIRAnalytics.h @@ -21,6 +21,8 @@ + (void)logEventWithName:(nonnull NSString *)name parameters:(nullable NSDictionary *)parameters; ++ (void)initiateOnDeviceConversionMeasurementWithEmailAddress:(nonnull NSString *)emailAddress; + + (void)setUserPropertyString:(nullable NSString *)value forName:(nonnull NSString *)name; + (void)setUserID:(nullable NSString *)userID; diff --git a/analytics/src_ios/fake/FIRAnalytics.mm b/analytics/src_ios/fake/FIRAnalytics.mm index 84e58c6ce6..61c160d9fb 100644 --- a/analytics/src_ios/fake/FIRAnalytics.mm +++ b/analytics/src_ios/fake/FIRAnalytics.mm @@ -55,6 +55,11 @@ + (void)logEventWithName:(nonnull NSString *)name } } ++ (void)initiateOnDeviceConversionMeasurementWithEmailAddress:(nonnull NSString *)emailAddress { + FakeReporter->AddReport("+[FIRAnalytics initiateOnDeviceConversionMeasurementWithEmailAddress:]", + { [emailAddress UTF8String] }); +} + + (void)setUserPropertyString:(nullable NSString *)value forName:(nonnull NSString *)name { FakeReporter->AddReport("+[FIRAnalytics setUserPropertyString:forName:]", { [name UTF8String], value ? [value UTF8String] : "nil" }); diff --git a/analytics/tests/analytics_test.cc b/analytics/tests/analytics_test.cc index 6f6e95ea78..ed0112f7c1 100644 --- a/analytics/tests/analytics_test.cc +++ b/analytics/tests/analytics_test.cc @@ -222,6 +222,16 @@ TEST_F(AnalyticsTest, TestLogEventParameters) { LogEvent("my_event", parameters, sizeof(parameters) / sizeof(parameters[0])); } +TEST_F(AnalyticsTest, + TestInitiateOnDeviceConversionMeasurementWithEmailAddress) { + // InitiateOnDeviceConversionMeasurementWithEmailAddress is no-op on Android + AddExpectationApple( + "+[FIRAnalytics initiateOnDeviceConversionMeasurementWithEmailAddress:]", + {"my_email"}); + + InitiateOnDeviceConversionMeasurementWithEmailAddress("my_email"); +} + TEST_F(AnalyticsTest, TestSetUserProperty) { AddExpectationAndroid("FirebaseAnalytics.setUserProperty", {"my_property", "my_value"}); diff --git a/release_build_files/readme.md b/release_build_files/readme.md index b78e3af194..190f7a0d73 100644 --- a/release_build_files/readme.md +++ b/release_build_files/readme.md @@ -605,6 +605,8 @@ code. only using AdMob, Analytics, Remote Config, or Messaging. - Functions: Add a new method `GetHttpsCallableFromURL`, to create callables with URLs other than cloudfunctions.net. + - Analytics (iOS): Added InitiateOnDeviceConversionMeasurementWithEmail function to facilitate the + [on-device conversion measurement](https://support.google.com/google-ads/answer/12119136) API. ### 9.0.0 - Changes