Skip to content

Commit 4fc2c68

Browse files
committed
Release 1.45.0
1 parent e235ec8 commit 4fc2c68

24 files changed

+556
-39
lines changed

Branch-SDK/BNCConfig.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,4 @@
1111
NSString * const BNC_API_BASE_URL = @"https://api2.branch.io";
1212
NSString * const BNC_API_VERSION = @"v1";
1313
NSString * const BNC_LINK_URL = @"https://bnc.lt";
14-
NSString * const BNC_SDK_VERSION = @"1.44.0";
14+
NSString * const BNC_SDK_VERSION = @"1.45.0";

Branch-SDK/BNCPreferenceHelper.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,11 @@ NSURL* /* _Nonnull */ BNCURLForBranchDirectory(void);
7272
@property (assign, nonatomic) NSTimeInterval referrerGBRAIDValidityWindow;
7373
@property (strong, nonatomic) NSDate *referrerGBRAIDInitDate;
7474

75+
@property (assign, nonatomic) NSInteger skanCurrentWindow;
76+
@property (assign, nonatomic) NSInteger highestConversionValueSent;
77+
@property (strong, nonatomic) NSDate *firstAppLaunchTime;
78+
@property (assign, nonatomic) BOOL invokeRegisterApp;
79+
7580
- (void) clearTrackingInformation;
7681

7782
+ (BNCPreferenceHelper *)sharedInstance;

Branch-SDK/BNCPreferenceHelper.m

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#import "BNCLog.h"
1414
#import "BranchConstants.h"
1515
#import "NSString+Branch.h"
16+
#import "BNCSKAdNetwork.h"
1617

1718
static const NSTimeInterval DEFAULT_TIMEOUT = 5.5;
1819
static const NSTimeInterval DEFAULT_RETRY_INTERVAL = 0;
@@ -48,6 +49,10 @@
4849
static NSString * const BRANCH_PREFS_KEY_REFERRER_GBRAID = @"bnc_referrer_gbraid";
4950
static NSString * const BRANCH_PREFS_KEY_REFERRER_GBRAID_WINDOW = @"bnc_referrer_gbraid_window";
5051
static NSString * const BRANCH_PREFS_KEY_REFERRER_GBRAID_INIT_DATE = @"bnc_referrer_gbraid_init_date";
52+
static NSString * const BRANCH_PREFS_KEY_SKAN_CURRENT_WINDOW = @"bnc_skan_current_window";
53+
static NSString * const BRANCH_PREFS_KEY_FIRST_APP_LAUNCH_TIME = @"bnc_first_app_launch_time";
54+
static NSString * const BRANCH_PREFS_KEY_SKAN_HIGHEST_CONV_VALUE_SENT = @"bnc_skan_send_highest_conv_value";
55+
static NSString * const BRANCH_PREFS_KEY_SKAN_INVOKE_REGISTER_APP = @"bnc_invoke_register_app";
5156

5257
NSURL* /* _Nonnull */ BNCURLForBranchDirectory_Unthreaded(void);
5358

@@ -94,7 +99,10 @@ @implementation BNCPreferenceHelper
9499
requestMetadataDictionary = _requestMetadataDictionary,
95100
instrumentationDictionary = _instrumentationDictionary,
96101
referrerGBRAID = _referrerGBRAID,
97-
referrerGBRAIDValidityWindow = _referrerGBRAIDValidityWindow;
102+
referrerGBRAIDValidityWindow = _referrerGBRAIDValidityWindow,
103+
skanCurrentWindow = _skanCurrentWindow,
104+
firstAppLaunchTime = _firstAppLaunchTime,
105+
highestConversionValueSent = _highestConversionValueSent;
98106

99107
+ (BNCPreferenceHelper *)sharedInstance {
100108
static BNCPreferenceHelper *preferenceHelper;
@@ -713,6 +721,69 @@ - (void)setReferrerGBRAIDInitDate:(NSDate *)initDate {
713721
}
714722
}
715723

724+
- (NSInteger) skanCurrentWindow {
725+
@synchronized (self) {
726+
_skanCurrentWindow = [self readIntegerFromDefaults:BRANCH_PREFS_KEY_SKAN_CURRENT_WINDOW];
727+
if(_skanCurrentWindow == NSNotFound)
728+
return BranchSkanWindowInvalid;
729+
return _skanCurrentWindow;
730+
}
731+
}
732+
733+
- (void) setSkanCurrentWindow:(NSInteger) window {
734+
@synchronized (self) {
735+
[self writeIntegerToDefaults:BRANCH_PREFS_KEY_SKAN_CURRENT_WINDOW value:window];
736+
}
737+
}
738+
739+
740+
- (NSDate *) firstAppLaunchTime {
741+
@synchronized (self) {
742+
if(!_firstAppLaunchTime) {
743+
_firstAppLaunchTime = (NSDate *)[self readObjectFromDefaults:BRANCH_PREFS_KEY_FIRST_APP_LAUNCH_TIME];
744+
}
745+
return _firstAppLaunchTime;
746+
}
747+
}
748+
749+
- (void) setFirstAppLaunchTime:(NSDate *) launchTime {
750+
@synchronized (self) {
751+
_firstAppLaunchTime = launchTime;
752+
[self writeObjectToDefaults:BRANCH_PREFS_KEY_FIRST_APP_LAUNCH_TIME value:launchTime];
753+
}
754+
}
755+
756+
- (NSInteger) highestConversionValueSent {
757+
@synchronized (self) {
758+
_highestConversionValueSent = [self readIntegerFromDefaults:BRANCH_PREFS_KEY_SKAN_HIGHEST_CONV_VALUE_SENT];
759+
if(_highestConversionValueSent == NSNotFound)
760+
return 0;
761+
return _highestConversionValueSent;
762+
}
763+
}
764+
765+
- (void) setHighestConversionValueSent:(NSInteger)value {
766+
@synchronized (self) {
767+
[self writeIntegerToDefaults:BRANCH_PREFS_KEY_SKAN_HIGHEST_CONV_VALUE_SENT value:value];
768+
}
769+
}
770+
771+
- (BOOL) invokeRegisterApp {
772+
@synchronized (self) {
773+
NSNumber *b = (id) [self readObjectFromDefaults:BRANCH_PREFS_KEY_SKAN_INVOKE_REGISTER_APP];
774+
if ([b isKindOfClass:NSNumber.class]) return [b boolValue];
775+
return false;
776+
}
777+
}
778+
779+
- (void) setInvokeRegisterApp:(BOOL)invoke {
780+
@synchronized(self) {
781+
NSNumber *b = [NSNumber numberWithBool:invoke];
782+
[self writeObjectToDefaults:BRANCH_PREFS_KEY_SKAN_INVOKE_REGISTER_APP value:b];
783+
}
784+
}
785+
786+
716787
- (void) clearTrackingInformation {
717788
@synchronized(self) {
718789
/*

Branch-SDK/BNCSKAdNetwork.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,13 @@
1010

1111
NS_ASSUME_NONNULL_BEGIN
1212

13+
typedef NS_ENUM(NSInteger, BranchSkanWindow) {
14+
BranchSkanWindowInvalid = 0,
15+
BranchSkanWindowFirst = 1,
16+
BranchSkanWindowSecond = 2,
17+
BranchSkanWindowThird = 3
18+
};
19+
1320
@interface BNCSKAdNetwork : NSObject
1421

1522
@property (nonatomic, assign, readwrite) NSTimeInterval maxTimeSinceInstall;
@@ -23,6 +30,21 @@ NS_ASSUME_NONNULL_BEGIN
2330
- (void)updatePostbackConversionValue:(NSInteger)conversionValue
2431
completionHandler:(void (^)(NSError *error))completion;
2532

33+
- (void)updatePostbackConversionValue:(NSInteger)fineValue
34+
coarseValue:(NSString *) coarseValue
35+
lockWindow:(BOOL)lockWindow
36+
completionHandler:(void (^)(NSError *error))completion API_AVAILABLE(ios(16.1));
37+
38+
- (int) calculateSKANWindowForTime:(NSDate *) currentTime;
39+
40+
- (NSString *) getCoarseConversionValueFromDataResponse:(NSDictionary *) dataResponseDictionary;
41+
42+
- (BOOL) getLockedStatusFromDataResponse:(NSDictionary *) dataResponseDictionary;
43+
44+
- (BOOL) getAscendingOnlyFromDataResponse:(NSDictionary *) dataResponseDictionary;
45+
46+
- (BOOL) shouldCallPostbackForDataResponse:(NSDictionary *) dataResponseDictionary;
47+
2648
@end
2749

2850
NS_ASSUME_NONNULL_END

Branch-SDK/BNCSKAdNetwork.m

Lines changed: 101 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
#import "BNCSKAdNetwork.h"
1010
#import "BNCApplication.h"
11+
#import "BNCPreferenceHelper.h"
12+
#import "BranchConstants.h"
1113

1214
@interface BNCSKAdNetwork()
1315

@@ -17,6 +19,7 @@ @interface BNCSKAdNetwork()
1719
@property (nonatomic, assign, readwrite) SEL skAdNetworkRegisterAppForAdNetworkAttribution;
1820
@property (nonatomic, assign, readwrite) SEL skAdNetworkUpdateConversionValue;
1921
@property (nonatomic, assign, readwrite) SEL skAdNetworkUpdatePostbackConversionValue;
22+
@property (nonatomic, assign, readwrite) SEL skAdNetworkUpdatePostbackConversionValueCoarseValueLockWindow;
2023

2124
@end
2225

@@ -34,14 +37,21 @@ + (BNCSKAdNetwork *)sharedInstance {
3437
- (instancetype)init {
3538
self = [super init];
3639
if (self) {
37-
// by default, we send updates to SKAdNetwork for up a day after install
38-
self.maxTimeSinceInstall = 3600.0 * 24.0;
40+
if (@available(iOS 16.1, *)){
41+
// For SKAN 4.0, its 60 days = 3600.0 * 24.0 * 60 seconds
42+
self.maxTimeSinceInstall = 3600.0 * 24.0 * 60;
43+
} else {
44+
// by default, we send updates to SKAdNetwork for up a day after install
45+
self.maxTimeSinceInstall = 3600.0 * 24.0;
46+
}
47+
3948
self.installDate = [BNCApplication currentApplication].currentInstallDate;
4049

4150
self.skAdNetworkClass = NSClassFromString(@"SKAdNetwork");
4251
self.skAdNetworkRegisterAppForAdNetworkAttribution = NSSelectorFromString(@"registerAppForAdNetworkAttribution");
4352
self.skAdNetworkUpdateConversionValue = NSSelectorFromString(@"updateConversionValue:");
4453
self.skAdNetworkUpdatePostbackConversionValue = NSSelectorFromString(@"updatePostbackConversionValue:completionHandler:");
54+
self.skAdNetworkUpdatePostbackConversionValueCoarseValueLockWindow = NSSelectorFromString(@"updatePostbackConversionValue:coarseValue:lockWindow:completionHandler:");
4555
}
4656
return self;
4757
}
@@ -91,4 +101,93 @@ - (void)updatePostbackConversionValue:(NSInteger)conversionValue
91101

92102
}
93103

104+
- (void)updatePostbackConversionValue:(NSInteger)fineValue
105+
coarseValue:(NSString *)coarseValue
106+
lockWindow:(BOOL)lockWindow
107+
completionHandler:(void (^)(NSError *error))completion {
108+
if (@available(iOS 16.1, *)) {
109+
if ([self shouldAttemptSKAdNetworkCallout]) {
110+
111+
((id (*)(id, SEL, NSInteger, NSString *, BOOL, void (^)(NSError *error)))[self.skAdNetworkClass methodForSelector:self.skAdNetworkUpdatePostbackConversionValueCoarseValueLockWindow])(self.skAdNetworkClass, self.skAdNetworkUpdatePostbackConversionValueCoarseValueLockWindow, fineValue, coarseValue, lockWindow, completion);
112+
}
113+
}
114+
}
115+
116+
- (int) calculateSKANWindowForTime:(NSDate *) currentTime{
117+
118+
int firstWindowDuration = 2 * 24 * 3600;
119+
int secondWindowDuration = 7 * 24 * 3600;
120+
int thirdWindowDuration = 35 * 24 * 3600;
121+
122+
NSTimeInterval timeDiff = [currentTime timeIntervalSinceDate:[BNCPreferenceHelper sharedInstance].firstAppLaunchTime];
123+
124+
if (timeDiff <= firstWindowDuration) {
125+
return BranchSkanWindowFirst;
126+
} else if (timeDiff <= secondWindowDuration) {
127+
return BranchSkanWindowSecond;
128+
}else if (timeDiff <= thirdWindowDuration) {
129+
return BranchSkanWindowThird;
130+
}
131+
return BranchSkanWindowInvalid;
132+
}
133+
134+
- (NSString *) getCoarseConversionValueFromDataResponse:(NSDictionary *) dataResponseDictionary{
135+
136+
NSString *coarseConversionValue = dataResponseDictionary[BRANCH_RESPONSE_KEY_COARSE_KEY] ;
137+
138+
if (!coarseConversionValue)
139+
return @"low";
140+
141+
return coarseConversionValue;
142+
143+
}
144+
145+
- (BOOL) getLockedStatusFromDataResponse:(NSDictionary *) dataResponseDictionary {
146+
147+
BOOL lockWin = NO;
148+
if([dataResponseDictionary[BRANCH_RESPONSE_KEY_UPDATE_IS_LOCKED] isKindOfClass:NSNumber.class])
149+
lockWin = ((NSNumber *)dataResponseDictionary[BRANCH_RESPONSE_KEY_UPDATE_IS_LOCKED]).boolValue;
150+
return lockWin;
151+
}
152+
153+
- (BOOL) getAscendingOnlyFromDataResponse:(NSDictionary *) dataResponseDictionary {
154+
155+
BOOL ascendingOnly = YES;
156+
if([dataResponseDictionary[BRANCH_RESPONSE_KEY_ASCENDING_ONLY] isKindOfClass:NSNumber.class])
157+
ascendingOnly = ((NSNumber *)dataResponseDictionary[BRANCH_RESPONSE_KEY_ASCENDING_ONLY]).boolValue;
158+
return ascendingOnly;
159+
}
160+
161+
- (BOOL) shouldCallPostbackForDataResponse:(NSDictionary *) dataResponseDictionary {
162+
163+
BOOL shouldCallUpdatePostback = NO;
164+
165+
if(![BNCPreferenceHelper sharedInstance].invokeRegisterApp)
166+
return shouldCallUpdatePostback;
167+
168+
NSNumber *conversionValue = (NSNumber *)dataResponseDictionary[BRANCH_RESPONSE_KEY_UPDATE_CONVERSION_VALUE];
169+
170+
int currentWindow = [self calculateSKANWindowForTime:[NSDate date]];
171+
172+
if(currentWindow == BranchSkanWindowInvalid)
173+
return shouldCallUpdatePostback;
174+
175+
if ( [BNCPreferenceHelper sharedInstance].skanCurrentWindow < currentWindow) {
176+
[BNCPreferenceHelper sharedInstance].highestConversionValueSent = 0;
177+
[BNCPreferenceHelper sharedInstance].skanCurrentWindow = currentWindow;
178+
}
179+
180+
int highestConversionValue = (int)[BNCPreferenceHelper sharedInstance].highestConversionValueSent;
181+
if( conversionValue.intValue <= highestConversionValue ){
182+
BOOL ascendingOnly = [self getAscendingOnlyFromDataResponse:dataResponseDictionary];
183+
if (!ascendingOnly)
184+
shouldCallUpdatePostback = YES;
185+
} else {
186+
[BNCPreferenceHelper sharedInstance].highestConversionValueSent = conversionValue.intValue;
187+
shouldCallUpdatePostback = YES;
188+
}
189+
190+
return shouldCallUpdatePostback;
191+
}
192+
94193
@end

Branch-SDK/BNCServerInterface.m

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -578,7 +578,14 @@ - (void)updateDeviceInfoToMutableDictionary:(NSMutableDictionary *)dict {
578578
// we do not need to send first_opt_in, if the install is older than 30 days
579579
- (BOOL)installDateIsRecent {
580580
//NSTimeInterval maxTimeSinceInstall = 60.0;
581-
NSTimeInterval maxTimeSinceInstall = 3600.0 * 24.0 * 30;
581+
NSTimeInterval maxTimeSinceInstall = 0;
582+
583+
if (@available(iOS 16.1, *)) {
584+
maxTimeSinceInstall = 3600.0 * 24.0 * 60; // For SKAN 4.0, The user has 60 days to launch the app.
585+
} else {
586+
maxTimeSinceInstall = 3600.0 * 24.0 * 30;
587+
}
588+
582589
NSDate *now = [NSDate date];
583590
NSDate *maxDate = [[BNCApplication currentApplication].currentInstallDate dateByAddingTimeInterval:maxTimeSinceInstall];
584591

Branch-SDK/Branch.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -701,7 +701,7 @@ typedef NS_ENUM(NSUInteger, BranchCreditHistoryOrder) {
701701
702702
Note: Branch does not automatically call SKAdNetwork unless configured on the dashboard.
703703
*/
704-
- (void)setSKAdNetworkCalloutMaxTimeSinceInstall:(NSTimeInterval)maxTimeInterval;
704+
- (void)setSKAdNetworkCalloutMaxTimeSinceInstall:(NSTimeInterval)maxTimeInterval __attribute__((deprecated(("This is no longer supported for iOS 16.1+ - SKAN4.0"))));
705705

706706
/*
707707
Add a Partner Parameter for Facebook.

Branch-SDK/Branch.m

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1006,7 +1006,11 @@ - (void)handleATTAuthorizationStatus:(NSUInteger)status {
10061006
}
10071007

10081008
- (void)setSKAdNetworkCalloutMaxTimeSinceInstall:(NSTimeInterval)maxTimeInterval {
1009-
[BNCSKAdNetwork sharedInstance].maxTimeSinceInstall = maxTimeInterval;
1009+
if (@available(iOS 16.1, *)) {
1010+
BNCLogDebug(@"This is no longer supported for iOS 16.1+ - SKAN4.0");
1011+
} else {
1012+
[BNCSKAdNetwork sharedInstance].maxTimeSinceInstall = maxTimeInterval;
1013+
}
10101014
}
10111015

10121016
#pragma mark - Partner Parameters
@@ -1642,6 +1646,10 @@ + (Branch *)getInstanceInternal:(NSString *)key {
16421646
[[BNCServerRequestQueue getInstance] clearQueue];
16431647
}
16441648

1649+
if(!preferenceHelper.firstAppLaunchTime){
1650+
preferenceHelper.firstAppLaunchTime = [NSDate date];
1651+
}
1652+
16451653
preferenceHelper.lastRunBranchKey = key;
16461654
branch =
16471655
[[Branch alloc] initWithInterface:[[BNCServerInterface alloc] init]

Branch-SDK/BranchConstants.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,9 @@ extern NSString * const BRANCH_RESPONSE_KEY_BRANCH_VIEW_DATA;
110110
extern NSString * const BRANCH_RESPONSE_KEY_BRANCH_REFERRING_LINK;
111111
extern NSString * const BRANCH_RESPONSE_KEY_INVOKE_REGISTER_APP;
112112
extern NSString * const BRANCH_RESPONSE_KEY_UPDATE_CONVERSION_VALUE;
113+
extern NSString * const BRANCH_RESPONSE_KEY_COARSE_KEY;
114+
extern NSString * const BRANCH_RESPONSE_KEY_UPDATE_IS_LOCKED;
115+
extern NSString * const BRANCH_RESPONSE_KEY_ASCENDING_ONLY;
113116

114117
extern NSString * const BRANCH_LINK_DATA_KEY_OG_TITLE;
115118
extern NSString * const BRANCH_LINK_DATA_KEY_OG_DESCRIPTION;

Branch-SDK/BranchConstants.m

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,9 @@
105105
NSString * const BRANCH_RESPONSE_KEY_BRANCH_REFERRING_LINK = @"~referring_link";
106106
NSString * const BRANCH_RESPONSE_KEY_INVOKE_REGISTER_APP = @"invoke_register_app";
107107
NSString * const BRANCH_RESPONSE_KEY_UPDATE_CONVERSION_VALUE = @"update_conversion_value";
108+
NSString * const BRANCH_RESPONSE_KEY_COARSE_KEY = @"coarse_key";
109+
NSString * const BRANCH_RESPONSE_KEY_UPDATE_IS_LOCKED = @"locked";
110+
NSString * const BRANCH_RESPONSE_KEY_ASCENDING_ONLY = @"ascending_only";
108111

109112
NSString * const BRANCH_LINK_DATA_KEY_OG_TITLE = @"$og_title";
110113
NSString * const BRANCH_LINK_DATA_KEY_OG_DESCRIPTION = @"$og_description";

0 commit comments

Comments
 (0)