Skip to content

Commit a2d6fac

Browse files
authored
Only log the URL follow event in messageClicked:withAction: if there's a URL to follow (#5564)
* Only log the URL follow event in messageClicked:withAction: if there's a URL to follow * Add test case for empty action URL
1 parent 521479e commit a2d6fac

File tree

2 files changed

+73
-13
lines changed

2 files changed

+73
-13
lines changed

FirebaseInAppMessaging/Sources/Flows/FIRIAMDisplayExecutor.m

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -105,16 +105,18 @@ - (void)messageClicked:(FIRInAppMessagingDisplayMessage *)inAppMessage
105105
[self recordValidImpression:_currentMsgBeingDisplayed.renderData.messageID
106106
withMessageName:_currentMsgBeingDisplayed.renderData.name];
107107

108-
[self.analyticsEventLogger
109-
logAnalyticsEventForType:FIRIAMAnalyticsEventActionURLFollow
110-
forCampaignID:_currentMsgBeingDisplayed.renderData.messageID
111-
withCampaignName:_currentMsgBeingDisplayed.renderData.name
112-
eventTimeInMs:nil
113-
completion:^(BOOL success) {
114-
FIRLogDebug(kFIRLoggerInAppMessaging, @"I-IAM400032",
115-
@"Logging analytics event for url following %@",
116-
success ? @"succeeded" : @"failed");
117-
}];
108+
if (action.actionURL) {
109+
[self.analyticsEventLogger
110+
logAnalyticsEventForType:FIRIAMAnalyticsEventActionURLFollow
111+
forCampaignID:_currentMsgBeingDisplayed.renderData.messageID
112+
withCampaignName:_currentMsgBeingDisplayed.renderData.name
113+
eventTimeInMs:nil
114+
completion:^(BOOL success) {
115+
FIRLogDebug(kFIRLoggerInAppMessaging, @"I-IAM400032",
116+
@"Logging analytics event for url following %@",
117+
success ? @"succeeded" : @"failed");
118+
}];
119+
}
118120
}
119121

120122
NSURL *actionURL = action.actionURL;

FirebaseInAppMessaging/Tests/Unit/FIRIAMDisplayExecutorTests.m

Lines changed: 61 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ @interface FIRIAMDisplayExecutorTests : XCTestCase
206206
@property id<FIRInAppMessagingDisplay> mockMessageDisplayComponent;
207207

208208
// four pre-defined messages
209-
@property FIRIAMMessageDefinition *m1, *m2, *m3, *m4;
209+
@property FIRIAMMessageDefinition *m1, *m2, *m3, *m4, *m5;
210210
@end
211211

212212
@implementation FIRIAMDisplayExecutorTests
@@ -220,7 +220,7 @@ - (void)setupMessageTexture {
220220
FIRIAMDisplayTriggerDefinition *contextualTriggerDefinition =
221221
[[FIRIAMDisplayTriggerDefinition alloc] initWithFirebaseAnalyticEvent:@"test_event"];
222222

223-
// m2 and m4 will be of app open trigger
223+
// m2, m4, and m5 will be of app open trigger
224224
FIRIAMDisplayTriggerDefinition *appOpentriggerDefinition =
225225
[[FIRIAMDisplayTriggerDefinition alloc] initForAppForegroundTrigger];
226226

@@ -338,6 +338,35 @@ - (void)setupMessageTexture {
338338
appData:@{@"a" : @"b", @"up" : @"dog"}
339339
experimentPayload:experimentPayload
340340
isTestMessage:NO];
341+
342+
FIRIAMMessageContentDataForTesting *m5ContentData = [[FIRIAMMessageContentDataForTesting alloc]
343+
initWithMessageTitle:nil
344+
messageBody:nil
345+
actionButtonText:nil
346+
secondaryActionButtonText:nil
347+
actionURL:nil
348+
secondaryActionURL:nil
349+
imageURL:[NSURL URLWithString:@"https://google.com/image"]
350+
landscapeImageURL:nil
351+
hasImageError:NO];
352+
353+
FIRIAMRenderingEffectSetting *renderSetting5 =
354+
[FIRIAMRenderingEffectSetting getDefaultRenderingEffectSetting];
355+
renderSetting5.viewMode = FIRIAMRenderAsImageOnlyView;
356+
357+
FIRIAMMessageRenderData *renderData5 =
358+
[[FIRIAMMessageRenderData alloc] initWithMessageID:@"m5"
359+
messageName:@"name"
360+
contentData:m5ContentData
361+
renderingEffect:renderSetting5];
362+
363+
self.m5 = [[FIRIAMMessageDefinition alloc] initWithRenderData:renderData5
364+
startTime:activeStartTime
365+
endTime:activeEndTime
366+
triggerDefinition:@[ appOpentriggerDefinition ]
367+
appData:nil
368+
experimentPayload:nil
369+
isTestMessage:NO];
341370
}
342371

343372
NSTimeInterval DISPLAY_MIN_INTERVALS = 1;
@@ -599,8 +628,37 @@ - (void)testAnalyticsTrackingOnMessageClickCase {
599628

600629
[self.clientMessageCache setMessageData:@[ self.m2 ]];
601630

631+
FIRInAppMessagingAction *m2Action = [[FIRInAppMessagingAction alloc]
632+
initWithActionText:self.m2.renderData.contentData.actionButtonText
633+
actionURL:self.m2.renderData.contentData.actionURL];
602634
FIRIAMMessageDisplayForTesting *display = [[FIRIAMMessageDisplayForTesting alloc]
603-
initWithDelegateInteraction:FIRInAppMessagingDelegateInteractionClick];
635+
initWithDelegateInteraction:FIRInAppMessagingDelegateInteractionClick
636+
action:m2Action];
637+
self.displayExecutor.messageDisplayComponent = display;
638+
639+
[self.displayExecutor checkAndDisplayNextAppForegroundMessage];
640+
OCMVerifyAll((id)self.mockAnalyticsEventLogger);
641+
}
642+
643+
- (void)testAnalyticsTrackingOnMessageClickCaseWithNoActionURL {
644+
// This setup allows next message to be displayed from display interval perspective.
645+
OCMStub([self.mockTimeFetcher currentTimestampInSeconds])
646+
.andReturn(DISPLAY_MIN_INTERVALS * 60 + 100);
647+
648+
// We expect two analytics events for a click action:
649+
// An impression event and an action URL follow event
650+
OCMExpect([self.mockAnalyticsEventLogger
651+
logAnalyticsEventForType:FIRIAMAnalyticsEventMessageImpression
652+
forCampaignID:[OCMArg isEqual:self.m5.renderData.messageID]
653+
withCampaignName:[OCMArg any]
654+
eventTimeInMs:[OCMArg any]
655+
completion:[OCMArg any]]);
656+
657+
[self.clientMessageCache setMessageData:@[ self.m5 ]];
658+
659+
FIRIAMMessageDisplayForTesting *display = [[FIRIAMMessageDisplayForTesting alloc]
660+
initWithDelegateInteraction:FIRInAppMessagingDelegateInteractionClick
661+
action:nil];
604662
self.displayExecutor.messageDisplayComponent = display;
605663

606664
[self.displayExecutor checkAndDisplayNextAppForegroundMessage];

0 commit comments

Comments
 (0)