Skip to content

Commit

Permalink
feat(analytics, ios): add support for initiateOnDeviceConversionMeasu…
Browse files Browse the repository at this point in the history
…rement using email address or phone number (#11926)

* feat(analytics, ios): add support for initiateOnDeviceConversionMeasurement using email address or phone number

* feat(analytics, ios): add support for initiateOnDeviceConversionMeasurement using email address or phone number

* more tests

* update API

* update tests
  • Loading branch information
Lyokone committed Jan 2, 2024
1 parent 2718db6 commit 9bc83f1
Show file tree
Hide file tree
Showing 11 changed files with 170 additions and 52 deletions.
Expand Up @@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
objectVersion = 50;
objectVersion = 54;
objects = {

/* Begin PBXBuildFile section */
Expand Down Expand Up @@ -169,7 +169,7 @@
97C146E61CF9000F007C117D /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 1300;
LastUpgradeCheck = 1430;
ORGANIZATIONNAME = "The Chromium Authors";
TargetAttributes = {
97C146ED1CF9000F007C117D = {
Expand Down Expand Up @@ -216,10 +216,12 @@
/* Begin PBXShellScriptBuildPhase section */
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
);
name = "Thin Binary";
outputPaths = (
Expand All @@ -230,6 +232,7 @@
};
9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
Expand Down
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1300"
LastUpgradeVersion = "1430"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
Expand Down
Expand Up @@ -47,5 +47,7 @@
<false/>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
</dict>
</plist>
106 changes: 59 additions & 47 deletions packages/firebase_analytics/firebase_analytics/example/lib/main.dart
Expand Up @@ -151,6 +151,12 @@ class _MyHomePageState extends State<MyHomePage> {
setMessage('resetAnalyticsData succeeded');
}

Future<void> _testInitiateOnDeviceConversionMeasurement() async {
await widget.analytics
.initiateOnDeviceConversionMeasurementWithEmailAddress('test@mail.com');
setMessage('initiateOnDeviceConversionMeasurement succeeded');
}

AnalyticsEventItem itemCreator() {
return AnalyticsEventItem(
affiliation: 'affil',
Expand Down Expand Up @@ -311,53 +317,59 @@ class _MyHomePageState extends State<MyHomePage> {
appBar: AppBar(
title: Text(widget.title),
),
body: Column(
children: <Widget>[
MaterialButton(
onPressed: _sendAnalyticsEvent,
child: const Text('Test logEvent'),
),
MaterialButton(
onPressed: _testAllEventTypes,
child: const Text('Test standard event types'),
),
MaterialButton(
onPressed: _testSetUserId,
child: const Text('Test setUserId'),
),
MaterialButton(
onPressed: _testSetCurrentScreen,
child: const Text('Test setCurrentScreen'),
),
MaterialButton(
onPressed: _testSetAnalyticsCollectionEnabled,
child: const Text('Test setAnalyticsCollectionEnabled'),
),
MaterialButton(
onPressed: _testSetSessionTimeoutDuration,
child: const Text('Test setSessionTimeoutDuration'),
),
MaterialButton(
onPressed: _testSetUserProperty,
child: const Text('Test setUserProperty'),
),
MaterialButton(
onPressed: _testAppInstanceId,
child: const Text('Test appInstanceId'),
),
MaterialButton(
onPressed: _testResetAnalyticsData,
child: const Text('Test resetAnalyticsData'),
),
MaterialButton(
onPressed: _setDefaultEventParameters,
child: const Text('Test setDefaultEventParameters'),
),
Text(
_message,
style: const TextStyle(color: Color.fromARGB(255, 0, 155, 0)),
),
],
body: Center(
child: Column(
children: <Widget>[
MaterialButton(
onPressed: _sendAnalyticsEvent,
child: const Text('Test logEvent'),
),
MaterialButton(
onPressed: _testAllEventTypes,
child: const Text('Test standard event types'),
),
MaterialButton(
onPressed: _testSetUserId,
child: const Text('Test setUserId'),
),
MaterialButton(
onPressed: _testSetCurrentScreen,
child: const Text('Test setCurrentScreen'),
),
MaterialButton(
onPressed: _testSetAnalyticsCollectionEnabled,
child: const Text('Test setAnalyticsCollectionEnabled'),
),
MaterialButton(
onPressed: _testSetSessionTimeoutDuration,
child: const Text('Test setSessionTimeoutDuration'),
),
MaterialButton(
onPressed: _testSetUserProperty,
child: const Text('Test setUserProperty'),
),
MaterialButton(
onPressed: _testAppInstanceId,
child: const Text('Test appInstanceId'),
),
MaterialButton(
onPressed: _testResetAnalyticsData,
child: const Text('Test resetAnalyticsData'),
),
MaterialButton(
onPressed: _setDefaultEventParameters,
child: const Text('Test setDefaultEventParameters'),
),
MaterialButton(
onPressed: _testInitiateOnDeviceConversionMeasurement,
child: const Text('Test initiateOnDeviceConversionMeasurement'),
),
Text(
_message,
style: const TextStyle(color: Color.fromARGB(255, 0, 155, 0)),
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
Expand Down
Expand Up @@ -74,6 +74,9 @@ - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result
[self getAppInstanceIdWithMethodCallResult:methodCallResult];
} else if ([@"Analytics#getSessionId" isEqualToString:call.method]) {
[self getSessionIdWithMethodCallResult:methodCallResult];
} else if ([@"Analytics#initiateOnDeviceConversionMeasurement" isEqualToString:call.method]) {
[self initiateOnDeviceConversionMeasurement:call.arguments
withMethodCallResult:methodCallResult];
} else {
result(FlutterMethodNotImplemented);
}
Expand Down Expand Up @@ -161,6 +164,20 @@ - (void)getAppInstanceIdWithMethodCallResult:(FLTFirebaseMethodCallResult *)resu
result.success(appInstanceID);
}

- (void)initiateOnDeviceConversionMeasurement:(id)arguments
withMethodCallResult:(FLTFirebaseMethodCallResult *)result {
NSString *emailAddress = arguments[@"emailAddress"];
NSString *phoneNumber = arguments[@"phoneNumber"];

if (![emailAddress isKindOfClass:[NSNull class]]) {
[FIRAnalytics initiateOnDeviceConversionMeasurementWithEmailAddress:emailAddress];
}
if (![phoneNumber isKindOfClass:[NSNull class]]) {
[FIRAnalytics initiateOnDeviceConversionMeasurementWithPhoneNumber:phoneNumber];
}
result.success(nil);
}

#pragma mark - FLTFirebasePlugin

- (void)didReinitializeFirebaseCore:(void (^_Nonnull)(void))completion {
Expand Down
Expand Up @@ -1360,6 +1360,40 @@ class FirebaseAnalytics extends FirebasePluginPlatform {
Future<void> setSessionTimeoutDuration(Duration timeout) async {
await _delegate.setSessionTimeoutDuration(timeout);
}

/// Initiates on-device conversion measurement given a user email address.
/// Requires dependency GoogleAppMeasurementOnDeviceConversion to be linked in, otherwise it is a no-op.
///
/// Only available on iOS.
Future<void> initiateOnDeviceConversionMeasurementWithEmailAddress(
String emailAddress,
) async {
if (defaultTargetPlatform != TargetPlatform.iOS) {
throw UnimplementedError(
'initiateOnDeviceConversionMeasurementWithEmailAddress() is only supported on iOS.',
);
}
await _delegate.initiateOnDeviceConversionMeasurement(
emailAddress: emailAddress,
);
}

/// Initiates on-device conversion measurement given a user phone number in E.164 format.
/// Requires dependency GoogleAppMeasurementOnDeviceConversion to be linked in, otherwise it is a no-op.
///
/// Only available on iOS.
Future<void> initiateOnDeviceConversionMeasurementWithPhoneNumber(
String phoneNumber,
) async {
if (defaultTargetPlatform != TargetPlatform.iOS) {
throw UnimplementedError(
'initiateOnDeviceConversionMeasurementWithPhoneNumber() is only supported on iOS.',
);
}
await _delegate.initiateOnDeviceConversionMeasurement(
phoneNumber: phoneNumber,
);
}
}

/// Android-specific analytics API.
Expand Down
Expand Up @@ -199,4 +199,22 @@ class MethodChannelFirebaseAnalytics extends FirebaseAnalyticsPlatform {
convertPlatformException(e, s);
}
}

@override
Future<void> initiateOnDeviceConversionMeasurement({
String? emailAddress,
String? phoneNumber,
}) {
try {
return channel.invokeMethod<void>(
'Analytics#initiateOnDeviceConversionMeasurement',
<String, String?>{
'emailAddress': emailAddress,
'phoneNumber': phoneNumber,
},
);
} catch (e, s) {
convertPlatformException(e, s);
}
}
}
Expand Up @@ -180,4 +180,14 @@ abstract class FirebaseAnalyticsPlatform extends PlatformInterface {
) {
throw UnimplementedError('setDefaultEventParameters() is not implemented');
}

/// Used for ads conversion measurement, without allowing any personally identifiable information to leave the user device.
Future<void> initiateOnDeviceConversionMeasurement({
String? emailAddress,
String? phoneNumber,
}) {
throw UnimplementedError(
'initiateOnDeviceConversionMeasurement() is not implemented',
);
}
}
Expand Up @@ -299,5 +299,27 @@ void main() {
expect(result2, isA<String>());
}
});

test(
'initiateOnDeviceConversionMeasurement',
() async {
await expectLater(
FirebaseAnalytics.instance
.initiateOnDeviceConversionMeasurementWithEmailAddress(
'test@mail.com',
),
completes,
);

await expectLater(
FirebaseAnalytics.instance
.initiateOnDeviceConversionMeasurementWithPhoneNumber(
'+15555555555',
),
completes,
);
},
skip: kIsWeb || defaultTargetPlatform != TargetPlatform.iOS,
);
});
}
2 changes: 1 addition & 1 deletion tests/ios/Runner.xcodeproj/project.pbxproj
Expand Up @@ -158,7 +158,7 @@
97C146E61CF9000F007C117D /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 1300;
LastUpgradeCheck = 1430;
ORGANIZATIONNAME = "";
TargetAttributes = {
97C146ED1CF9000F007C117D = {
Expand Down
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1300"
LastUpgradeVersion = "1430"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
Expand Down

0 comments on commit 9bc83f1

Please sign in to comment.