Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions BranchSDK.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -500,6 +500,12 @@
E7FAF6A02E26E497006C167F /* BranchConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = E7FAF69F2E26E497006C167F /* BranchConstants.h */; settings = {ATTRIBUTES = (Public, ); }; };
E7FAF6A12E26E497006C167F /* BranchConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = E7FAF69F2E26E497006C167F /* BranchConstants.h */; settings = {ATTRIBUTES = (Public, ); }; };
E7FAF6A22E26E497006C167F /* BranchConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = E7FAF69F2E26E497006C167F /* BranchConstants.h */; settings = {ATTRIBUTES = (Public, ); }; };
BB00000001000000000000B1 /* BranchConfigurationController.h in Headers */ = {isa = PBXBuildFile; fileRef = BB00000001000000000000A1 /* BranchConfigurationController.h */; };
BB00000002000000000000B1 /* BranchConfigurationController.h in Headers */ = {isa = PBXBuildFile; fileRef = BB00000001000000000000A1 /* BranchConfigurationController.h */; };
BB00000003000000000000B1 /* BranchConfigurationController.h in Headers */ = {isa = PBXBuildFile; fileRef = BB00000001000000000000A1 /* BranchConfigurationController.h */; };
BB00000004000000000000B1 /* BranchConfigurationController.m in Sources */ = {isa = PBXBuildFile; fileRef = BB00000004000000000000A1 /* BranchConfigurationController.m */; };
BB00000005000000000000B1 /* BranchConfigurationController.m in Sources */ = {isa = PBXBuildFile; fileRef = BB00000004000000000000A1 /* BranchConfigurationController.m */; };
BB00000006000000000000B1 /* BranchConfigurationController.m in Sources */ = {isa = PBXBuildFile; fileRef = BB00000004000000000000A1 /* BranchConfigurationController.m */; };
/* End PBXBuildFile section */

/* Begin PBXContainerItemProxy section */
Expand Down Expand Up @@ -705,6 +711,8 @@
E7F311AD2DACB4D400F824A7 /* BNCODMInfoCollector.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = BNCODMInfoCollector.m; sourceTree = "<group>"; };
E7F311B02DACB54100F824A7 /* BNCODMInfoCollector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BNCODMInfoCollector.h; sourceTree = "<group>"; };
E7FAF69F2E26E497006C167F /* BranchConstants.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BranchConstants.h; sourceTree = "<group>"; };
BB00000001000000000000A1 /* BranchConfigurationController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BranchConfigurationController.h; sourceTree = "<group>"; };
BB00000004000000000000A1 /* BranchConfigurationController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = BranchConfigurationController.m; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
Expand Down
69 changes: 69 additions & 0 deletions Sources/BranchSDK/BNCSKAdNetwork.m
Original file line number Diff line number Diff line change
Expand Up @@ -218,6 +218,75 @@ - (BOOL) shouldCallPostbackForDataResponse:(NSDictionary *) dataResponseDictiona
return shouldCallUpdatePostback;
}

- (void)updateConversionValueFromResponse:(NSDictionary *)responseData {
if (![responseData[BRANCH_RESPONSE_KEY_UPDATE_CONVERSION_VALUE] isKindOfClass:NSNumber.class]) {
return;
}

NSNumber *conversionValue = (NSNumber *)responseData[BRANCH_RESPONSE_KEY_UPDATE_CONVERSION_VALUE];
if (!conversionValue || ![BNCPreferenceHelper sharedInstance].invokeRegisterApp) {
return;
}

void (^completionHandler)(NSError *) = ^(NSError * _Nullable error) {
if (error) {
[[BranchLogger shared] logError:[NSString stringWithFormat:@"Update conversion value failed with error - %@", [error description]] error:error];
} else {
[[BranchLogger shared] logDebug:[NSString stringWithFormat:@"Update conversion value was successful. Conversion Value - %@", conversionValue] error:nil];
}
};

if (@available(iOS 16.1, macCatalyst 16.1, *)) {
NSString *coarseConversionValue = [self getCoarseConversionValueFromDataResponse:responseData];
BOOL lockWin = [self getLockedStatusFromDataResponse:responseData];
BOOL shouldCallUpdatePostback = [self shouldCallPostbackForDataResponse:responseData];

[[BranchLogger shared] logDebug:[NSString stringWithFormat:@"SKAN 4.0 params - conversionValue:%@ coarseValue:%@, locked:%d, shouldCallPostback:%d, currentWindow:%d, firstAppLaunchTime: %@", conversionValue, coarseConversionValue, lockWin, shouldCallUpdatePostback, (int)[BNCPreferenceHelper sharedInstance].skanCurrentWindow, [BNCPreferenceHelper sharedInstance].firstAppLaunchTime] error:nil];

if (shouldCallUpdatePostback) {
[self updatePostbackConversionValue:conversionValue.longValue coarseValue:coarseConversionValue lockWindow:lockWin completionHandler:completionHandler];
}
} else if (@available(iOS 15.4, macCatalyst 15.4, *)) {
[self updatePostbackConversionValue:conversionValue.intValue completionHandler:completionHandler];
} else {
[self updateConversionValue:conversionValue.integerValue];
}
}

- (void (^)(NSError *))skanCompletionHandlerWithSuccessDescription:(NSString *)description {
return ^(NSError * _Nullable error) {
if (error) {
[[BranchLogger shared] logError:[NSString stringWithFormat:@"Update conversion value failed with error - %@", [error description]] error:error];
} else {
[[BranchLogger shared] logDebug:[NSString stringWithFormat:@"Update conversion value was successful for %@", description] error:nil];
}
};
}

- (void)registerAndUpdateConversionFromResponse:(NSDictionary *)data isInstall:(BOOL)isInstall {
BNCPreferenceHelper *preferenceHelper = [BNCPreferenceHelper sharedInstance];

if ([data[BRANCH_RESPONSE_KEY_INVOKE_REGISTER_APP] isKindOfClass:NSNumber.class]) {
NSNumber *invokeRegister = (NSNumber *)data[BRANCH_RESPONSE_KEY_INVOKE_REGISTER_APP];
preferenceHelper.invokeRegisterApp = invokeRegister.boolValue;
if (invokeRegister.boolValue && isInstall) {
void (^completionHandler)(NSError *) = [self skanCompletionHandlerWithSuccessDescription:@"INSTALL Event"];
if (@available(iOS 16.1, macCatalyst 16.1, *)){
NSString *defaultCoarseConValue = [self getCoarseConversionValueFromDataResponse:@{}];
[self updatePostbackConversionValue:0 coarseValue:defaultCoarseConValue
lockWindow:NO completionHandler:completionHandler];
} else if (@available(iOS 15.4, macCatalyst 15.4, *)){
[self updatePostbackConversionValue:0 completionHandler:completionHandler];
}
else {
[self registerAppForAdNetworkAttribution];
}
}
} else {
preferenceHelper.invokeRegisterApp = NO;
}
}

- (BOOL)isSKANAllowedForAttributionLevel {
BranchAttributionLevel level = [[BNCPreferenceHelper sharedInstance] attributionLevel];
return !([level isEqualToString:BranchAttributionLevelMinimal] ||
Expand Down
77 changes: 62 additions & 15 deletions Sources/BranchSDK/Branch.m
Original file line number Diff line number Diff line change
Expand Up @@ -690,6 +690,10 @@ + (void)setAnonID:(NSString *)anonID {
}

- (void)setConsumerProtectionAttributionLevel:(BranchAttributionLevel)level {
[self setConsumerProtectionAttributionLevel:level resetSession:YES];
}

- (void)setConsumerProtectionAttributionLevel:(BranchAttributionLevel)level resetSession:(BOOL)resetSession {
self.preferenceHelper.attributionLevel = level;

[[BranchLogger shared] logVerbose:[NSString stringWithFormat:@"Setting Consumer Protection Attribution Level to %@", level] error:nil];
Expand Down Expand Up @@ -720,8 +724,10 @@ - (void)setConsumerProtectionAttributionLevel:(BranchAttributionLevel)level {
// Set the flag:
[BNCPreferenceHelper sharedInstance].trackingDisabled = NO;

// Initialize a Branch session:
[[Branch getInstance] initUserSessionAndCallCallback:NO sceneIdentifier:nil urlString:nil reset:true];
if (resetSession) {
// Initialize a Branch session:
[[Branch getInstance] initUserSessionAndCallCallback:NO sceneIdentifier:nil urlString:nil reset:true];
}
}
}

Expand Down Expand Up @@ -1220,7 +1226,16 @@ - (void)logoutWithCallback:(callbackWithStatus)callback {
}

- (void)sendServerRequest:(BNCServerRequest*)request {
[self initSafetyCheck];
@synchronized (self) {
if (self.initializationStatus == BNCInitStatusUninitialized) {
NSError *error = [NSError branchErrorWithCode:BNCInitError];
[[BranchLogger shared] logWarning:@"Branch SDK is not initialized, cannot send this request. Please intialize session before calling this API." error:error];
dispatch_async(dispatch_get_main_queue(), ^{
[[BNCCallbackMap shared] callCompletionForRequest:request withSuccessStatus:NO error:error];
});
return;
}
}
dispatch_async(self.isolationQueue, ^(){
[self.requestQueue enqueue:request];
[self processNextQueueItem];
Expand Down Expand Up @@ -1298,7 +1313,16 @@ - (BranchLinkProperties *)getLatestReferringBranchLinkProperties {
#pragma mark - Query methods

- (void)lastAttributedTouchDataWithAttributionWindow:(NSInteger)window completion:(void(^) (BranchLastAttributedTouchData * _Nullable latd, NSError * _Nullable error))completion {
[self initSafetyCheck];
@synchronized (self) {
if (self.initializationStatus == BNCInitStatusUninitialized) {
NSError *error = [NSError branchErrorWithCode:BNCInitError];
[[BranchLogger shared] logWarning:@"Branch SDK is not initialized, cannot request LATD. Please intialize session before calling this API." error:error];
dispatch_async(dispatch_get_main_queue(), ^{
if (completion) { completion(nil, error); }
});
return;
}
}
dispatch_async(self.isolationQueue, ^(){
[BranchLastAttributedTouchData requestLastTouchAttributedData:self.serverInterface key:self.class.branchKey attributionWindow:window completion:completion];
});
Expand Down Expand Up @@ -1419,7 +1443,16 @@ - (void)getShortUrlWithParams:(NSDictionary *)params andTags:(NSArray *)tags and
}

- (void)getSpotlightUrlWithParams:(NSDictionary *)params callback:(callbackWithParams)callback {
[self initSafetyCheck];
@synchronized (self) {
if (self.initializationStatus == BNCInitStatusUninitialized) {
NSError *error = [NSError branchErrorWithCode:BNCInitError];
[[BranchLogger shared] logWarning:@"Branch SDK is not initialized, cannot create Spotlight URL. Please intialize session before calling this API." error:error];
dispatch_async(dispatch_get_main_queue(), ^{
if (callback) { callback(nil, error); }
});
return;
}
}
dispatch_async(self.isolationQueue, ^(){
BranchSpotlightUrlRequest *req = [[BranchSpotlightUrlRequest alloc] initWithParams:params callback:callback];
[self.requestQueue enqueue:req];
Expand Down Expand Up @@ -1683,7 +1716,18 @@ - (void)generateShortUrl:(NSArray *)tags
andCampaign:campaign andParams:(NSDictionary *)params
andCallback:(callbackWithUrl)callback {

[self initSafetyCheck];
@synchronized (self) {
if (self.initializationStatus == BNCInitStatusUninitialized) {
NSError *error = [NSError branchErrorWithCode:BNCInitError];
[[BranchLogger shared] logWarning:@"Branch SDK is not initialized, cannot generate short URL. Please intialize session before calling this API." error:error];
if (callback) {
dispatch_async(dispatch_get_main_queue(), ^{
callback(nil, error);
});
}
return;
}
}
dispatch_async(self.isolationQueue, ^(){
BNCLinkData *linkData = [self prepareLinkDataFor:tags
andAlias:alias
Expand Down Expand Up @@ -1891,7 +1935,18 @@ - (BNCLinkData *)prepareLinkDataFor:(NSArray *)tags
#pragma mark - BranchUniversalObject methods

- (void)registerViewWithParams:(NSDictionary *)params andCallback:(callbackWithParams)callback {
[self initSafetyCheck];
@synchronized (self) {
if (self.initializationStatus == BNCInitStatusUninitialized) {
NSError *error = [NSError branchErrorWithCode:BNCInitError];
[[BranchLogger shared] logWarning:@"Branch SDK is not initialized, cannot register view. Please intialize session before calling this API." error:error];
if (callback) {
dispatch_async(dispatch_get_main_queue(), ^{
callback(nil, error);
});
}
return;
}
}
dispatch_async(self.isolationQueue, ^(){
BranchUniversalObject *buo = [[BranchUniversalObject alloc] init];
buo.contentMetadata.customMetadata = (id) params;
Expand Down Expand Up @@ -2151,14 +2206,6 @@ - (void)notifyNativeToInit {
self.cachedInitBlock = nil;
}

// SDK-631 Workaround to maintain existing error handling behavior.
// Some methods require init before they are called. Instead of returning an error, we try to fix the situation by calling init ourselves.
- (void)initSafetyCheck {
if (self.initializationStatus == BNCInitStatusUninitialized) {
[[BranchLogger shared] logDebug:@"Branch avoided an error by preemptively initializing." error:nil];
[self initUserSessionAndCallCallback:NO sceneIdentifier:nil urlString:nil reset:NO];
}
}

- (void)initUserSessionAndCallCallback:(BOOL)callCallback sceneIdentifier:(NSString *)sceneIdentifier urlString:(NSString *)urlString reset:(BOOL)reset {

Expand Down
35 changes: 2 additions & 33 deletions Sources/BranchSDK/BranchEvent.m
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
#import "BNCReachability.h"
#import "BNCSKAdNetwork.h"
#import "BNCPartnerParameters.h"
#import "BNCPreferenceHelper.h"
#import "BNCEventUtils.h"
#import "BNCRequestFactory.h"
#import "BNCServerAPI.h"
Expand Down Expand Up @@ -88,38 +87,8 @@ - (void)processResponse:(BNCServerResponse*)response error:(NSError*)error {
? (NSDictionary*) response.data : nil;

#if !TARGET_OS_TV
if (dictionary && [dictionary[BRANCH_RESPONSE_KEY_UPDATE_CONVERSION_VALUE] isKindOfClass:NSNumber.class]) {
NSNumber *conversionValue = (NSNumber *)dictionary[BRANCH_RESPONSE_KEY_UPDATE_CONVERSION_VALUE];
// Regardless of SKAN opted-in in dashboard, we always get conversionValue, so adding check to find out if install/open response had "invoke_register_app" true
if (conversionValue && [BNCPreferenceHelper sharedInstance].invokeRegisterApp) {
if (@available(iOS 16.1, macCatalyst 16.1, *)){
NSString * coarseConversionValue = [[BNCSKAdNetwork sharedInstance] getCoarseConversionValueFromDataResponse:dictionary] ;
BOOL lockWin = [[BNCSKAdNetwork sharedInstance] getLockedStatusFromDataResponse:dictionary];
BOOL shouldCallUpdatePostback = [[BNCSKAdNetwork sharedInstance] shouldCallPostbackForDataResponse:dictionary];

[[BranchLogger shared] logDebug:[NSString stringWithFormat:@"SKAN 4.0 params - conversionValue:%@ coarseValue:%@, locked:%d, shouldCallPostback:%d, currentWindow:%d, firstAppLaunchTime: %@", conversionValue, coarseConversionValue, lockWin, shouldCallUpdatePostback, (int)[BNCPreferenceHelper sharedInstance].skanCurrentWindow, [BNCPreferenceHelper sharedInstance].firstAppLaunchTime] error:nil];
if(shouldCallUpdatePostback){
[[BNCSKAdNetwork sharedInstance] updatePostbackConversionValue: conversionValue.longValue coarseValue:coarseConversionValue lockWindow:lockWin completionHandler:^(NSError * _Nullable error) {
if (error) {
[[BranchLogger shared] logError:[NSString stringWithFormat:@"Update conversion value failed with error - %@", [error description]] error:error];
} else {
[[BranchLogger shared] logDebug:[NSString stringWithFormat:@"Update conversion value was successful. Conversion Value - %@", conversionValue] error:nil];
}
}];
}

} else if (@available(iOS 15.4, macCatalyst 15.4, *)) {
[[BNCSKAdNetwork sharedInstance] updatePostbackConversionValue:conversionValue.intValue completionHandler: ^(NSError *error){
if (error) {
[[BranchLogger shared] logError:[NSString stringWithFormat:@"Update conversion value failed with error - %@", [error description]] error:error];
} else {
[[BranchLogger shared] logDebug:[NSString stringWithFormat:@"Update conversion value was successful. Conversion Value - %@", conversionValue] error:nil];
}
}];
} else {
[[BNCSKAdNetwork sharedInstance] updateConversionValue:conversionValue.integerValue];
}
}
if (dictionary) {
[[BNCSKAdNetwork sharedInstance] updateConversionValueFromResponse:dictionary];
}
#endif

Expand Down
Loading
Loading