Skip to content

Commit 9efc2be

Browse files
authored
Adding "utmParametersDictionary" api to FIRDynamicLink (#7505)
Adding "utmParametersDictionary" api to FIRDynamicLink. This new property will enable 3p developers to fetch the Utm parameters associated with a Firebase Dynamic Link. Related Issue: #6730 API Review Doc : https://docs.google.com/document/d/1NDBjiuCQEs3vnaPGfYKK2cdvJMIsJqukRtrZf8wsWCk (Approved)
1 parent 01ad007 commit 9efc2be

File tree

6 files changed

+115
-9
lines changed

6 files changed

+115
-9
lines changed

FIRDynamicLinkTest.m

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
/*
2+
* Copyright 2021 Google LLC
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
#import <Foundation/Foundation.h>
18+
#import <XCTest/XCTest.h>
19+
#import "FirebaseDynamicLinks/Sources/FIRDynamicLink+Private.h"
20+
21+
@interface FIRDynamicLinkTest : XCTestCase {
22+
}
23+
@end
24+
25+
@implementation FIRDynamicLinkTest
26+
27+
NSMutableDictionary<NSString *, NSString *> *fdlParameters = nil;
28+
NSDictionary<NSString *, NSString *> *linkParameters = nil;
29+
NSDictionary<NSString *, NSString *> *utmParameters = nil;
30+
31+
- (void)setUp {
32+
[super setUp];
33+
34+
linkParameters = @{
35+
@"deep_link_id" : @"https://mmaksym.com/test-app1",
36+
@"match_message" : @"Link is uniquely matched for this device.",
37+
@"match_type" : @"unique",
38+
@"a_parameter" : @"a_value"
39+
};
40+
utmParameters = @{
41+
@"utm_campaign" : @"eldhosembabu Test",
42+
@"utm_medium" : @"test_medium",
43+
@"utm_source" : @"test_source",
44+
};
45+
46+
fdlParameters = [[NSMutableDictionary alloc] initWithDictionary:linkParameters];
47+
[fdlParameters addEntriesFromDictionary:utmParameters];
48+
}
49+
50+
- (void)testDynamicLinkParameters_InitWithParameters {
51+
FIRDynamicLink *dynamicLink = [[FIRDynamicLink alloc] initWithParametersDictionary:fdlParameters];
52+
XCTAssertEqual([fdlParameters count], [[dynamicLink parametersDictionary] count]);
53+
for (NSString *key in fdlParameters) {
54+
NSString *expectedValue = [fdlParameters valueForKey:key];
55+
NSString *derivedValue = [[dynamicLink parametersDictionary] valueForKey:key];
56+
XCTAssertNotNil(derivedValue, @"Cannot be null!");
57+
XCTAssertEqualObjects(derivedValue, expectedValue);
58+
}
59+
}
60+
61+
- (void)testDynamicLinkUtmParameters_InitWithParameters {
62+
FIRDynamicLink *dynamicLink = [[FIRDynamicLink alloc] initWithParametersDictionary:fdlParameters];
63+
XCTAssertEqual([[dynamicLink utmParametersDictionary] count], [utmParameters count]);
64+
for (NSString *key in utmParameters) {
65+
NSString *expectedValue = [utmParameters valueForKey:key];
66+
NSString *derivedValue = [[dynamicLink utmParametersDictionary] valueForKey:key];
67+
XCTAssertNotNil(derivedValue, @"Cannot be null!");
68+
XCTAssertEqualObjects(derivedValue, expectedValue);
69+
}
70+
}
71+
72+
- (void)testDynamicLinkParameters_InitWithNoUtmParameters {
73+
FIRDynamicLink *dynamicLink =
74+
[[FIRDynamicLink alloc] initWithParametersDictionary:linkParameters];
75+
XCTAssertEqual([[dynamicLink parametersDictionary] count], [linkParameters count]);
76+
XCTAssertEqual([[dynamicLink utmParametersDictionary] count], 0);
77+
}
78+
79+
@end

FirebaseDynamicLinks/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
# v7.7.0
2+
- [added] Added `utmParametersDictionary` property to `DynamicLink`. (#6730)
3+
14
# v7.6.0
25
- [fixed] Fixed build warnings introduced with Xcode 12.5. (#7434)
36

FirebaseDynamicLinks/Sources/FIRDynamicLink.m

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323

2424
@implementation FIRDynamicLink
2525

26+
NSString *const FDLUTMParamPrefix = @"utm_";
27+
2628
- (NSString *)description {
2729
return [NSString stringWithFormat:@"<%@: %p, url [%@], match type: %@, minimumAppVersion: %@, "
2830
"match message: %@>",
@@ -36,7 +38,7 @@ - (instancetype)initWithParametersDictionary:(NSDictionary<NSString *, id> *)par
3638

3739
if (self = [super init]) {
3840
_parametersDictionary = [parameters copy];
39-
41+
_utmParametersDictionary = [[self class] extractUTMParams:parameters];
4042
NSString *urlString = parameters[kFIRDLParameterDeepLinkIdentifier];
4143
_url = [NSURL URLWithString:urlString];
4244
_inviteId = parameters[kFIRDLParameterInviteId];
@@ -134,6 +136,18 @@ + (FIRDLMatchType)matchTypeWithString:(NSString *)string {
134136
return [matchMap[string] integerValue] ?: FIRDLMatchTypeNone;
135137
}
136138

139+
+ (NSDictionary<NSString *, id> *)extractUTMParams:(NSDictionary<NSString *, id> *)parameters {
140+
NSMutableDictionary<NSString *, id> *utmParamsDictionary = [[NSMutableDictionary alloc] init];
141+
142+
for (NSString *key in parameters) {
143+
if ([key hasPrefix:FDLUTMParamPrefix]) {
144+
[utmParamsDictionary setObject:[parameters valueForKey:key] forKey:key];
145+
}
146+
}
147+
148+
return [[NSDictionary alloc] initWithDictionary:utmParamsDictionary];
149+
}
150+
137151
@end
138152

139153
#endif // TARGET_OS_IOS

FirebaseDynamicLinks/Sources/Public/FirebaseDynamicLinks/FIRDynamicLink.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,12 @@ NS_SWIFT_NAME(DynamicLink)
6767
*/
6868
@property(nonatomic, assign, readonly) FIRDLMatchType matchType;
6969

70+
/**
71+
* @property utmParametersDictionary
72+
* @abstract UTM parameters associated with a Firebase Dynamic Link.
73+
*/
74+
@property(nonatomic, copy, readonly) NSDictionary<NSString *, id> *utmParametersDictionary;
75+
7076
/**
7177
* @property minimumAppVersion
7278
* @abstract The minimum iOS application version that supports the Dynamic Link. This is retrieved

FirebaseDynamicLinks/Tests/Sample/FDLBuilderTestAppObjC/AppDelegate.m

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,12 @@ - (void)_showDynamicLinkInfo:(FIRDynamicLink *)dynamicLink {
8484

8585
UIAlertController *alertVC = [UIAlertController
8686
alertControllerWithTitle:@"Got Dynamic Link!"
87-
message:[NSString stringWithFormat:
88-
@"URL [%@], matchType [%ld], minimumAppVersion [%@]",
89-
dynamicLink.url, (unsigned long)dynamicLink.matchType,
90-
dynamicLink.minimumAppVersion]
87+
message:[NSString stringWithFormat:@"URL [%@], matchType [%ld], "
88+
@"minimumAppVersion [%@], utmParams [%@]",
89+
dynamicLink.url,
90+
(unsigned long)dynamicLink.matchType,
91+
dynamicLink.minimumAppVersion,
92+
dynamicLink.utmParametersDictionary]
9193
preferredStyle:UIAlertControllerStyleAlert];
9294
[alertVC addAction:[UIAlertAction actionWithTitle:@"Dismiss"
9395
style:UIAlertActionStyleCancel

FirebaseDynamicLinks/Tests/Sample/FDLBuilderTestAppObjC/SceneDelegate.m

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,10 +92,12 @@ - (void)_showDynamicLinkInfo:(FIRDynamicLink *)dynamicLink {
9292

9393
UIAlertController *alertVC = [UIAlertController
9494
alertControllerWithTitle:@"Got Dynamic Link!"
95-
message:[NSString stringWithFormat:
96-
@"URL [%@], matchType [%ld], minimumAppVersion [%@]",
97-
dynamicLink.url, (unsigned long)dynamicLink.matchType,
98-
dynamicLink.minimumAppVersion]
95+
message:[NSString stringWithFormat:@"URL [%@], matchType [%ld], "
96+
@"minimumAppVersion [%@], utmParams [%@]",
97+
dynamicLink.url,
98+
(unsigned long)dynamicLink.matchType,
99+
dynamicLink.minimumAppVersion,
100+
dynamicLink.utmParametersDictionary]
99101
preferredStyle:UIAlertControllerStyleAlert];
100102
[alertVC addAction:[UIAlertAction actionWithTitle:@"Dismiss"
101103
style:UIAlertActionStyleCancel

0 commit comments

Comments
 (0)