From 040f16b0f5897c246a1d870688c81cd6c20cfe50 Mon Sep 17 00:00:00 2001 From: Aditi3 Date: Thu, 27 Jan 2022 14:49:11 +0530 Subject: [PATCH 01/16] Update `compatibilityVersion` to `Xcode 10.0` From 9612a39fe465d11b3e536eb5bedb30930e3198f3 Mon Sep 17 00:00:00 2001 From: uerceg Date: Mon, 5 Dec 2022 12:59:26 +0100 Subject: [PATCH 02/16] refac: check if class implemenets selector prior to invocation --- Adjust/ADJSKAdNetwork.m | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/Adjust/ADJSKAdNetwork.m b/Adjust/ADJSKAdNetwork.m index 586b5958d..454c0fe9e 100644 --- a/Adjust/ADJSKAdNetwork.m +++ b/Adjust/ADJSKAdNetwork.m @@ -59,7 +59,7 @@ - (instancetype)init { - (void)registerAppForAdNetworkAttribution { if (@available(iOS 14.0, *)) { - if ([self isStoreKitAvailable]) { + if ([self isApiAvailable:self.selRegisterAppForAdNetworkAttribution]) { ((id (*)(id, SEL))[self.clsSkAdNetwork methodForSelector:self.selRegisterAppForAdNetworkAttribution])(self.clsSkAdNetwork, self.selRegisterAppForAdNetworkAttribution); [self.logger debug:@"Called SKAdNetwork's registerAppForAdNetworkAttribution method"]; } @@ -70,7 +70,7 @@ - (void)registerAppForAdNetworkAttribution { - (void)updateConversionValue:(NSInteger)conversionValue { if (@available(iOS 14.0, *)) { - if ([self isStoreKitAvailable]) { + if ([self isApiAvailable:self.selUpdateConversionValue]) { ((id (*)(id, SEL, NSInteger))[self.clsSkAdNetwork methodForSelector:self.selUpdateConversionValue])(self.clsSkAdNetwork, self.selUpdateConversionValue, conversionValue); [self.logger verbose:@"Called SKAdNetwork's updateConversionValue: method made with conversion value: %d", conversionValue]; } @@ -82,7 +82,7 @@ - (void)updateConversionValue:(NSInteger)conversionValue { - (void)updatePostbackConversionValue:(NSInteger)conversionValue completionHandler:(void (^)(NSError *error))completion { if (@available(iOS 15.4, *)) { - if ([self isStoreKitAvailable]) { + if ([self isApiAvailable:self.selUpdatePostbackConversionValueCompletionHandler]) { ((id (*)(id, SEL, NSInteger, void (^)(NSError *error)))[self.clsSkAdNetwork methodForSelector:self.selUpdatePostbackConversionValueCompletionHandler])(self.clsSkAdNetwork, self.selUpdatePostbackConversionValueCompletionHandler, conversionValue, completion); // call is made, success / failure will be checked and logged inside of the completion block } @@ -95,7 +95,7 @@ - (void)updatePostbackConversionValue:(NSInteger)fineValue coarseValue:(NSString *)coarseValue completionHandler:(void (^)(NSError *error))completion { if (@available(iOS 16.1, *)) { - if ([self isStoreKitAvailable]) { + if ([self isApiAvailable:self.selUpdatePostbackConversionValueCoarseValueCompletionHandler]) { ((id (*)(id, SEL, NSInteger, NSString *, void (^)(NSError *error)))[self.clsSkAdNetwork methodForSelector:self.selUpdatePostbackConversionValueCoarseValueCompletionHandler])(self.clsSkAdNetwork, self.selUpdatePostbackConversionValueCoarseValueCompletionHandler, fineValue, coarseValue, completion); // call is made, success / failure will be checked and logged inside of the completion block } @@ -109,7 +109,7 @@ - (void)updatePostbackConversionValue:(NSInteger)fineValue lockWindow:(BOOL)lockWindow completionHandler:(void (^)(NSError *error))completion { if (@available(iOS 16.1, *)) { - if ([self isStoreKitAvailable]) { + if ([self isApiAvailable:self.selUpdatePostbackConversionValueCoarseValueLockWindowCompletionHandler]) { ((id (*)(id, SEL, NSInteger, NSString *, BOOL, void (^)(NSError *error)))[self.clsSkAdNetwork methodForSelector:self.selUpdatePostbackConversionValueCoarseValueLockWindowCompletionHandler])(self.clsSkAdNetwork, self.selUpdatePostbackConversionValueCoarseValueLockWindowCompletionHandler, fineValue, coarseValue, lockWindow, completion); // call is made, success / failure will be checked and logged inside of the completion block } @@ -172,11 +172,16 @@ - (void)adjUpdateConversionValue:(NSInteger)conversionValue #pragma mark - Private -- (BOOL)isStoreKitAvailable { +- (BOOL)isApiAvailable:(SEL)selector { if (self.clsSkAdNetwork == nil) { [self.logger warn:@"StoreKit.framework not found in the app (SKAdNetwork class not found)"]; return NO; } + IMP imp = [self.clsSkAdNetwork methodForSelector:selector]; + if (imp == nil) { + [self.logger warn:@"%@ method implementation not found", selector]; + return NO; + } return YES; } From 4dc5cdf4e10be3f4de0359da224229a1e6e5e1a3 Mon Sep 17 00:00:00 2001 From: uerceg Date: Mon, 5 Dec 2022 13:01:37 +0100 Subject: [PATCH 03/16] refac: invoke adjRegister only if not disabled --- Adjust/ADJActivityHandler.m | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/Adjust/ADJActivityHandler.m b/Adjust/ADJActivityHandler.m index fd0a962d1..22efdfcaf 100644 --- a/Adjust/ADJActivityHandler.m +++ b/Adjust/ADJActivityHandler.m @@ -174,11 +174,13 @@ - (id)initWithConfig:(ADJConfig *)adjustConfig [self readActivityState]; // register SKAdNetwork attribution if we haven't already - [[ADJSKAdNetwork getInstance] adjRegisterWithCompletionHandler:^(NSError * _Nonnull error) { - if (error) { - // handle error - } - }]; + if (self.adjustConfig.isSKAdNetworkHandlingActive) { + [[ADJSKAdNetwork getInstance] adjRegisterWithCompletionHandler:^(NSError * _Nonnull error) { + if (error) { + // handle error + } + }]; + } self.internalState = [[ADJInternalState alloc] init]; From d947519020719b69861ad3b471e2c4376b86837e Mon Sep 17 00:00:00 2001 From: uerceg Date: Mon, 5 Dec 2022 13:34:36 +0100 Subject: [PATCH 04/16] refac: switch to NSInvocation --- Adjust/ADJSKAdNetwork.m | 60 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/Adjust/ADJSKAdNetwork.m b/Adjust/ADJSKAdNetwork.m index 454c0fe9e..517024edd 100644 --- a/Adjust/ADJSKAdNetwork.m +++ b/Adjust/ADJSKAdNetwork.m @@ -59,10 +59,20 @@ - (instancetype)init { - (void)registerAppForAdNetworkAttribution { if (@available(iOS 14.0, *)) { + /* if ([self isApiAvailable:self.selRegisterAppForAdNetworkAttribution]) { ((id (*)(id, SEL))[self.clsSkAdNetwork methodForSelector:self.selRegisterAppForAdNetworkAttribution])(self.clsSkAdNetwork, self.selRegisterAppForAdNetworkAttribution); [self.logger debug:@"Called SKAdNetwork's registerAppForAdNetworkAttribution method"]; } + */ + if ([self isApiAvailable:self.selRegisterAppForAdNetworkAttribution]) { + NSMethodSignature *methodSignature = [self.clsSkAdNetwork methodSignatureForSelector:self.selRegisterAppForAdNetworkAttribution]; + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature]; + [invocation setSelector:self.selRegisterAppForAdNetworkAttribution]; + [invocation setTarget:self.clsSkAdNetwork]; + [invocation invoke]; + [self.logger verbose:@"Call to SKAdNetwork's registerAppForAdNetworkAttribution method made"]; + } } else { [self.logger warn:@"SKAdNetwork's registerAppForAdNetworkAttribution method not available for this operating system version"]; } @@ -70,10 +80,21 @@ - (void)registerAppForAdNetworkAttribution { - (void)updateConversionValue:(NSInteger)conversionValue { if (@available(iOS 14.0, *)) { + /* if ([self isApiAvailable:self.selUpdateConversionValue]) { ((id (*)(id, SEL, NSInteger))[self.clsSkAdNetwork methodForSelector:self.selUpdateConversionValue])(self.clsSkAdNetwork, self.selUpdateConversionValue, conversionValue); [self.logger verbose:@"Called SKAdNetwork's updateConversionValue: method made with conversion value: %d", conversionValue]; } + */ + if ([self isApiAvailable:self.selUpdateConversionValue]) { + NSMethodSignature *methodSignature = [self.clsSkAdNetwork methodSignatureForSelector:self.selUpdateConversionValue]; + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature]; + [invocation setSelector:self.selUpdateConversionValue]; + [invocation setTarget:self.clsSkAdNetwork]; + [invocation setArgument:&conversionValue atIndex:2]; + [invocation invoke]; + [self.logger verbose:@"Call to SKAdNetwork's updateConversionValue: method made with value %d", conversionValue]; + } } else { [self.logger warn:@"SKAdNetwork's updateConversionValue: method not available for this operating system version"]; } @@ -82,10 +103,21 @@ - (void)updateConversionValue:(NSInteger)conversionValue { - (void)updatePostbackConversionValue:(NSInteger)conversionValue completionHandler:(void (^)(NSError *error))completion { if (@available(iOS 15.4, *)) { + /* if ([self isApiAvailable:self.selUpdatePostbackConversionValueCompletionHandler]) { ((id (*)(id, SEL, NSInteger, void (^)(NSError *error)))[self.clsSkAdNetwork methodForSelector:self.selUpdatePostbackConversionValueCompletionHandler])(self.clsSkAdNetwork, self.selUpdatePostbackConversionValueCompletionHandler, conversionValue, completion); // call is made, success / failure will be checked and logged inside of the completion block } + */ + if ([self isApiAvailable:self.selUpdatePostbackConversionValueCompletionHandler]) { + NSMethodSignature *methodSignature = [self.clsSkAdNetwork methodSignatureForSelector:self.selUpdatePostbackConversionValueCompletionHandler]; + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature]; + [invocation setSelector:self.selUpdatePostbackConversionValueCompletionHandler]; + [invocation setTarget:self.clsSkAdNetwork]; + [invocation setArgument:&conversionValue atIndex:2]; + [invocation setArgument:&completion atIndex:3]; + [invocation invoke]; + } } else { [self.logger warn:@"SKAdNetwork's updatePostbackConversionValue:completionHandler: method not available for this operating system version"]; } @@ -95,10 +127,22 @@ - (void)updatePostbackConversionValue:(NSInteger)fineValue coarseValue:(NSString *)coarseValue completionHandler:(void (^)(NSError *error))completion { if (@available(iOS 16.1, *)) { + /* if ([self isApiAvailable:self.selUpdatePostbackConversionValueCoarseValueCompletionHandler]) { ((id (*)(id, SEL, NSInteger, NSString *, void (^)(NSError *error)))[self.clsSkAdNetwork methodForSelector:self.selUpdatePostbackConversionValueCoarseValueCompletionHandler])(self.clsSkAdNetwork, self.selUpdatePostbackConversionValueCoarseValueCompletionHandler, fineValue, coarseValue, completion); // call is made, success / failure will be checked and logged inside of the completion block } + */ + if ([self isApiAvailable:self.selUpdatePostbackConversionValueCoarseValueCompletionHandler]) { + NSMethodSignature *methodSignature = [self.clsSkAdNetwork methodSignatureForSelector:self.selUpdatePostbackConversionValueCoarseValueCompletionHandler]; + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature]; + [invocation setSelector:self.selUpdatePostbackConversionValueCoarseValueCompletionHandler]; + [invocation setTarget:self.clsSkAdNetwork]; + [invocation setArgument:&fineValue atIndex:2]; + [invocation setArgument:&coarseValue atIndex:3]; + [invocation setArgument:&completion atIndex:4]; + [invocation invoke]; + } } else { [self.logger warn:@"SKAdNetwork's updatePostbackConversionValue:coarseValue:completionHandler: method not available for this operating system version"]; } @@ -109,10 +153,23 @@ - (void)updatePostbackConversionValue:(NSInteger)fineValue lockWindow:(BOOL)lockWindow completionHandler:(void (^)(NSError *error))completion { if (@available(iOS 16.1, *)) { + /* if ([self isApiAvailable:self.selUpdatePostbackConversionValueCoarseValueLockWindowCompletionHandler]) { ((id (*)(id, SEL, NSInteger, NSString *, BOOL, void (^)(NSError *error)))[self.clsSkAdNetwork methodForSelector:self.selUpdatePostbackConversionValueCoarseValueLockWindowCompletionHandler])(self.clsSkAdNetwork, self.selUpdatePostbackConversionValueCoarseValueLockWindowCompletionHandler, fineValue, coarseValue, lockWindow, completion); // call is made, success / failure will be checked and logged inside of the completion block } + */ + if ([self isApiAvailable:self.selUpdatePostbackConversionValueCoarseValueLockWindowCompletionHandler]) { + NSMethodSignature *methodSignature = [self.clsSkAdNetwork methodSignatureForSelector:self.selUpdatePostbackConversionValueCoarseValueLockWindowCompletionHandler]; + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature]; + [invocation setSelector:self.selUpdatePostbackConversionValueCoarseValueLockWindowCompletionHandler]; + [invocation setTarget:self.clsSkAdNetwork]; + [invocation setArgument:&fineValue atIndex:2]; + [invocation setArgument:&coarseValue atIndex:3]; + [invocation setArgument:&lockWindow atIndex:4]; + [invocation setArgument:&completion atIndex:5]; + [invocation invoke]; + } } else { [self.logger warn:@"SKAdNetwork's updatePostbackConversionValue:coarseValue:lockWindow:completionHandler: method not available for this operating system version"]; } @@ -177,8 +234,7 @@ - (BOOL)isApiAvailable:(SEL)selector { [self.logger warn:@"StoreKit.framework not found in the app (SKAdNetwork class not found)"]; return NO; } - IMP imp = [self.clsSkAdNetwork methodForSelector:selector]; - if (imp == nil) { + if ([self.clsSkAdNetwork respondsToSelector:selector] == NO) { [self.logger warn:@"%@ method implementation not found", selector]; return NO; } From 6c487bc451a3db4279516b71cc590728194f7e1f Mon Sep 17 00:00:00 2001 From: uerceg Date: Mon, 5 Dec 2022 15:21:43 +0100 Subject: [PATCH 05/16] chore: clean up unused comments --- Adjust/ADJSKAdNetwork.m | 30 ------------------------------ 1 file changed, 30 deletions(-) diff --git a/Adjust/ADJSKAdNetwork.m b/Adjust/ADJSKAdNetwork.m index 517024edd..ecd887440 100644 --- a/Adjust/ADJSKAdNetwork.m +++ b/Adjust/ADJSKAdNetwork.m @@ -59,12 +59,6 @@ - (instancetype)init { - (void)registerAppForAdNetworkAttribution { if (@available(iOS 14.0, *)) { - /* - if ([self isApiAvailable:self.selRegisterAppForAdNetworkAttribution]) { - ((id (*)(id, SEL))[self.clsSkAdNetwork methodForSelector:self.selRegisterAppForAdNetworkAttribution])(self.clsSkAdNetwork, self.selRegisterAppForAdNetworkAttribution); - [self.logger debug:@"Called SKAdNetwork's registerAppForAdNetworkAttribution method"]; - } - */ if ([self isApiAvailable:self.selRegisterAppForAdNetworkAttribution]) { NSMethodSignature *methodSignature = [self.clsSkAdNetwork methodSignatureForSelector:self.selRegisterAppForAdNetworkAttribution]; NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature]; @@ -80,12 +74,6 @@ - (void)registerAppForAdNetworkAttribution { - (void)updateConversionValue:(NSInteger)conversionValue { if (@available(iOS 14.0, *)) { - /* - if ([self isApiAvailable:self.selUpdateConversionValue]) { - ((id (*)(id, SEL, NSInteger))[self.clsSkAdNetwork methodForSelector:self.selUpdateConversionValue])(self.clsSkAdNetwork, self.selUpdateConversionValue, conversionValue); - [self.logger verbose:@"Called SKAdNetwork's updateConversionValue: method made with conversion value: %d", conversionValue]; - } - */ if ([self isApiAvailable:self.selUpdateConversionValue]) { NSMethodSignature *methodSignature = [self.clsSkAdNetwork methodSignatureForSelector:self.selUpdateConversionValue]; NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature]; @@ -103,12 +91,6 @@ - (void)updateConversionValue:(NSInteger)conversionValue { - (void)updatePostbackConversionValue:(NSInteger)conversionValue completionHandler:(void (^)(NSError *error))completion { if (@available(iOS 15.4, *)) { - /* - if ([self isApiAvailable:self.selUpdatePostbackConversionValueCompletionHandler]) { - ((id (*)(id, SEL, NSInteger, void (^)(NSError *error)))[self.clsSkAdNetwork methodForSelector:self.selUpdatePostbackConversionValueCompletionHandler])(self.clsSkAdNetwork, self.selUpdatePostbackConversionValueCompletionHandler, conversionValue, completion); - // call is made, success / failure will be checked and logged inside of the completion block - } - */ if ([self isApiAvailable:self.selUpdatePostbackConversionValueCompletionHandler]) { NSMethodSignature *methodSignature = [self.clsSkAdNetwork methodSignatureForSelector:self.selUpdatePostbackConversionValueCompletionHandler]; NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature]; @@ -127,12 +109,6 @@ - (void)updatePostbackConversionValue:(NSInteger)fineValue coarseValue:(NSString *)coarseValue completionHandler:(void (^)(NSError *error))completion { if (@available(iOS 16.1, *)) { - /* - if ([self isApiAvailable:self.selUpdatePostbackConversionValueCoarseValueCompletionHandler]) { - ((id (*)(id, SEL, NSInteger, NSString *, void (^)(NSError *error)))[self.clsSkAdNetwork methodForSelector:self.selUpdatePostbackConversionValueCoarseValueCompletionHandler])(self.clsSkAdNetwork, self.selUpdatePostbackConversionValueCoarseValueCompletionHandler, fineValue, coarseValue, completion); - // call is made, success / failure will be checked and logged inside of the completion block - } - */ if ([self isApiAvailable:self.selUpdatePostbackConversionValueCoarseValueCompletionHandler]) { NSMethodSignature *methodSignature = [self.clsSkAdNetwork methodSignatureForSelector:self.selUpdatePostbackConversionValueCoarseValueCompletionHandler]; NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature]; @@ -153,12 +129,6 @@ - (void)updatePostbackConversionValue:(NSInteger)fineValue lockWindow:(BOOL)lockWindow completionHandler:(void (^)(NSError *error))completion { if (@available(iOS 16.1, *)) { - /* - if ([self isApiAvailable:self.selUpdatePostbackConversionValueCoarseValueLockWindowCompletionHandler]) { - ((id (*)(id, SEL, NSInteger, NSString *, BOOL, void (^)(NSError *error)))[self.clsSkAdNetwork methodForSelector:self.selUpdatePostbackConversionValueCoarseValueLockWindowCompletionHandler])(self.clsSkAdNetwork, self.selUpdatePostbackConversionValueCoarseValueLockWindowCompletionHandler, fineValue, coarseValue, lockWindow, completion); - // call is made, success / failure will be checked and logged inside of the completion block - } - */ if ([self isApiAvailable:self.selUpdatePostbackConversionValueCoarseValueLockWindowCompletionHandler]) { NSMethodSignature *methodSignature = [self.clsSkAdNetwork methodSignatureForSelector:self.selUpdatePostbackConversionValueCoarseValueLockWindowCompletionHandler]; NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature]; From 34282e8f6a00c0be2c743c12c6e525b94d45ea7b Mon Sep 17 00:00:00 2001 From: uerceg Date: Mon, 5 Dec 2022 15:39:50 +0100 Subject: [PATCH 06/16] refac: refactor SKAD code --- Adjust/ADJSKAdNetwork.m | 72 +++++++++++++++++++++-------------------- 1 file changed, 37 insertions(+), 35 deletions(-) diff --git a/Adjust/ADJSKAdNetwork.m b/Adjust/ADJSKAdNetwork.m index ecd887440..26747f195 100644 --- a/Adjust/ADJSKAdNetwork.m +++ b/Adjust/ADJSKAdNetwork.m @@ -16,12 +16,6 @@ @interface ADJSKAdNetwork() @property (nonatomic, weak) id logger; -@property (nonatomic, strong) Class clsSkAdNetwork; -@property (nonatomic, assign) SEL selRegisterAppForAdNetworkAttribution; -@property (nonatomic, assign) SEL selUpdateConversionValue; -@property (nonatomic, assign) SEL selUpdatePostbackConversionValueCompletionHandler; -@property (nonatomic, assign) SEL selUpdatePostbackConversionValueCoarseValueCompletionHandler; -@property (nonatomic, assign) SEL selUpdatePostbackConversionValueCoarseValueLockWindowCompletionHandler; @end @@ -45,12 +39,6 @@ - (instancetype)init { } self.logger = [ADJAdjustFactory logger]; - self.clsSkAdNetwork = NSClassFromString(@"SKAdNetwork"); - self.selRegisterAppForAdNetworkAttribution = NSSelectorFromString(@"registerAppForAdNetworkAttribution"); - self.selUpdateConversionValue = NSSelectorFromString(@"updateConversionValue:"); - self.selUpdatePostbackConversionValueCompletionHandler = NSSelectorFromString(@"updatePostbackConversionValue:completionHandler:"); - self.selUpdatePostbackConversionValueCoarseValueCompletionHandler = NSSelectorFromString(@"updatePostbackConversionValue:coarseValue:completionHandler:"); - self.selUpdatePostbackConversionValueCoarseValueLockWindowCompletionHandler = NSSelectorFromString(@"updatePostbackConversionValue:coarseValue:lockWindow:completionHandler:"); return self; } @@ -58,12 +46,14 @@ - (instancetype)init { #pragma mark - SKAdNetwork API - (void)registerAppForAdNetworkAttribution { + Class class = NSClassFromString(@"SKAdNetwork"); + SEL selector = NSSelectorFromString(@"registerAppForAdNetworkAttribution"); if (@available(iOS 14.0, *)) { - if ([self isApiAvailable:self.selRegisterAppForAdNetworkAttribution]) { - NSMethodSignature *methodSignature = [self.clsSkAdNetwork methodSignatureForSelector:self.selRegisterAppForAdNetworkAttribution]; + if ([self isApiAvailableForClass:class andSelector:selector]) { + NSMethodSignature *methodSignature = [class methodSignatureForSelector:selector]; NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature]; - [invocation setSelector:self.selRegisterAppForAdNetworkAttribution]; - [invocation setTarget:self.clsSkAdNetwork]; + [invocation setSelector:selector]; + [invocation setTarget:class]; [invocation invoke]; [self.logger verbose:@"Call to SKAdNetwork's registerAppForAdNetworkAttribution method made"]; } @@ -73,12 +63,14 @@ - (void)registerAppForAdNetworkAttribution { } - (void)updateConversionValue:(NSInteger)conversionValue { + Class class = NSClassFromString(@"SKAdNetwork"); + SEL selector = NSSelectorFromString(@"updateConversionValue:"); if (@available(iOS 14.0, *)) { - if ([self isApiAvailable:self.selUpdateConversionValue]) { - NSMethodSignature *methodSignature = [self.clsSkAdNetwork methodSignatureForSelector:self.selUpdateConversionValue]; + if ([self isApiAvailableForClass:class andSelector:selector]) { + NSMethodSignature *methodSignature = [class methodSignatureForSelector:selector]; NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature]; - [invocation setSelector:self.selUpdateConversionValue]; - [invocation setTarget:self.clsSkAdNetwork]; + [invocation setSelector:selector]; + [invocation setTarget:class]; [invocation setArgument:&conversionValue atIndex:2]; [invocation invoke]; [self.logger verbose:@"Call to SKAdNetwork's updateConversionValue: method made with value %d", conversionValue]; @@ -90,12 +82,14 @@ - (void)updateConversionValue:(NSInteger)conversionValue { - (void)updatePostbackConversionValue:(NSInteger)conversionValue completionHandler:(void (^)(NSError *error))completion { + Class class = NSClassFromString(@"SKAdNetwork"); + SEL selector = NSSelectorFromString(@"updatePostbackConversionValue:completionHandler:"); if (@available(iOS 15.4, *)) { - if ([self isApiAvailable:self.selUpdatePostbackConversionValueCompletionHandler]) { - NSMethodSignature *methodSignature = [self.clsSkAdNetwork methodSignatureForSelector:self.selUpdatePostbackConversionValueCompletionHandler]; + if ([self isApiAvailableForClass:class andSelector:selector]) { + NSMethodSignature *methodSignature = [class methodSignatureForSelector:selector]; NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature]; - [invocation setSelector:self.selUpdatePostbackConversionValueCompletionHandler]; - [invocation setTarget:self.clsSkAdNetwork]; + [invocation setSelector:selector]; + [invocation setTarget:class]; [invocation setArgument:&conversionValue atIndex:2]; [invocation setArgument:&completion atIndex:3]; [invocation invoke]; @@ -108,12 +102,14 @@ - (void)updatePostbackConversionValue:(NSInteger)conversionValue - (void)updatePostbackConversionValue:(NSInteger)fineValue coarseValue:(NSString *)coarseValue completionHandler:(void (^)(NSError *error))completion { + Class class = NSClassFromString(@"SKAdNetwork"); + SEL selector = NSSelectorFromString(@"updatePostbackConversionValue:coarseValue:completionHandler:"); if (@available(iOS 16.1, *)) { - if ([self isApiAvailable:self.selUpdatePostbackConversionValueCoarseValueCompletionHandler]) { - NSMethodSignature *methodSignature = [self.clsSkAdNetwork methodSignatureForSelector:self.selUpdatePostbackConversionValueCoarseValueCompletionHandler]; + if ([self isApiAvailableForClass:class andSelector:selector]) { + NSMethodSignature *methodSignature = [class methodSignatureForSelector:selector]; NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature]; - [invocation setSelector:self.selUpdatePostbackConversionValueCoarseValueCompletionHandler]; - [invocation setTarget:self.clsSkAdNetwork]; + [invocation setSelector:selector]; + [invocation setTarget:class]; [invocation setArgument:&fineValue atIndex:2]; [invocation setArgument:&coarseValue atIndex:3]; [invocation setArgument:&completion atIndex:4]; @@ -128,12 +124,14 @@ - (void)updatePostbackConversionValue:(NSInteger)fineValue coarseValue:(NSString *)coarseValue lockWindow:(BOOL)lockWindow completionHandler:(void (^)(NSError *error))completion { + Class class = NSClassFromString(@"SKAdNetwork"); + SEL selector = NSSelectorFromString(@"updatePostbackConversionValue:coarseValue:lockWindow:completionHandler:"); if (@available(iOS 16.1, *)) { - if ([self isApiAvailable:self.selUpdatePostbackConversionValueCoarseValueLockWindowCompletionHandler]) { - NSMethodSignature *methodSignature = [self.clsSkAdNetwork methodSignatureForSelector:self.selUpdatePostbackConversionValueCoarseValueLockWindowCompletionHandler]; + if ([self isApiAvailableForClass:class andSelector:selector]) { + NSMethodSignature *methodSignature = [class methodSignatureForSelector:selector]; NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature]; - [invocation setSelector:self.selUpdatePostbackConversionValueCoarseValueLockWindowCompletionHandler]; - [invocation setTarget:self.clsSkAdNetwork]; + [invocation setSelector:selector]; + [invocation setTarget:class]; [invocation setArgument:&fineValue atIndex:2]; [invocation setArgument:&coarseValue atIndex:3]; [invocation setArgument:&lockWindow atIndex:4]; @@ -199,12 +197,16 @@ - (void)adjUpdateConversionValue:(NSInteger)conversionValue #pragma mark - Private -- (BOOL)isApiAvailable:(SEL)selector { - if (self.clsSkAdNetwork == nil) { +- (BOOL)isApiAvailableForClass:(Class)class andSelector:(SEL)selector { + if (class == nil) { [self.logger warn:@"StoreKit.framework not found in the app (SKAdNetwork class not found)"]; return NO; } - if ([self.clsSkAdNetwork respondsToSelector:selector] == NO) { + if (!selector) { + [self.logger warn:@"Selector for given method was not found"]; + return NO; + } + if ([class respondsToSelector:selector] == NO) { [self.logger warn:@"%@ method implementation not found", selector]; return NO; } From 5d7d21671326b6afb6fcfa6ce60b493cb20f7796 Mon Sep 17 00:00:00 2001 From: uerceg Date: Mon, 5 Dec 2022 15:55:59 +0100 Subject: [PATCH 07/16] fix: fix logging of the SEL name --- Adjust/ADJSKAdNetwork.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adjust/ADJSKAdNetwork.m b/Adjust/ADJSKAdNetwork.m index 26747f195..efc75ecbd 100644 --- a/Adjust/ADJSKAdNetwork.m +++ b/Adjust/ADJSKAdNetwork.m @@ -207,7 +207,7 @@ - (BOOL)isApiAvailableForClass:(Class)class andSelector:(SEL)selector { return NO; } if ([class respondsToSelector:selector] == NO) { - [self.logger warn:@"%@ method implementation not found", selector]; + [self.logger warn:@"%@ method implementation not found", NSStringFromSelector(selector)]; return NO; } return YES; From ec24532418cf899f2d4c0c3309b94630e04a5510 Mon Sep 17 00:00:00 2001 From: Aditi3 Date: Mon, 5 Dec 2022 16:13:44 +0100 Subject: [PATCH 08/16] refac: add a method to get `SKAdNetwork` class --- Adjust/ADJSKAdNetwork.m | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/Adjust/ADJSKAdNetwork.m b/Adjust/ADJSKAdNetwork.m index efc75ecbd..2b3c964a3 100644 --- a/Adjust/ADJSKAdNetwork.m +++ b/Adjust/ADJSKAdNetwork.m @@ -46,7 +46,7 @@ - (instancetype)init { #pragma mark - SKAdNetwork API - (void)registerAppForAdNetworkAttribution { - Class class = NSClassFromString(@"SKAdNetwork"); + Class class = [self getSKAdNetworkClass]; SEL selector = NSSelectorFromString(@"registerAppForAdNetworkAttribution"); if (@available(iOS 14.0, *)) { if ([self isApiAvailableForClass:class andSelector:selector]) { @@ -63,7 +63,7 @@ - (void)registerAppForAdNetworkAttribution { } - (void)updateConversionValue:(NSInteger)conversionValue { - Class class = NSClassFromString(@"SKAdNetwork"); + Class class = [self getSKAdNetworkClass]; SEL selector = NSSelectorFromString(@"updateConversionValue:"); if (@available(iOS 14.0, *)) { if ([self isApiAvailableForClass:class andSelector:selector]) { @@ -82,7 +82,7 @@ - (void)updateConversionValue:(NSInteger)conversionValue { - (void)updatePostbackConversionValue:(NSInteger)conversionValue completionHandler:(void (^)(NSError *error))completion { - Class class = NSClassFromString(@"SKAdNetwork"); + Class class = [self getSKAdNetworkClass]; SEL selector = NSSelectorFromString(@"updatePostbackConversionValue:completionHandler:"); if (@available(iOS 15.4, *)) { if ([self isApiAvailableForClass:class andSelector:selector]) { @@ -102,7 +102,7 @@ - (void)updatePostbackConversionValue:(NSInteger)conversionValue - (void)updatePostbackConversionValue:(NSInteger)fineValue coarseValue:(NSString *)coarseValue completionHandler:(void (^)(NSError *error))completion { - Class class = NSClassFromString(@"SKAdNetwork"); + Class class = [self getSKAdNetworkClass]; SEL selector = NSSelectorFromString(@"updatePostbackConversionValue:coarseValue:completionHandler:"); if (@available(iOS 16.1, *)) { if ([self isApiAvailableForClass:class andSelector:selector]) { @@ -124,7 +124,7 @@ - (void)updatePostbackConversionValue:(NSInteger)fineValue coarseValue:(NSString *)coarseValue lockWindow:(BOOL)lockWindow completionHandler:(void (^)(NSError *error))completion { - Class class = NSClassFromString(@"SKAdNetwork"); + Class class = [self getSKAdNetworkClass]; SEL selector = NSSelectorFromString(@"updatePostbackConversionValue:coarseValue:lockWindow:completionHandler:"); if (@available(iOS 16.1, *)) { if ([self isApiAvailableForClass:class andSelector:selector]) { @@ -237,4 +237,8 @@ - (NSString *)getSkAdNetworkCoarseConversionValue:(NSString *)adjustCoarseValue } } +- (Class)getSKAdNetworkClass { + return NSClassFromString(@"SKAdNetwork"); +} + @end From 1ad7074acab9fabd1e4330940997f5c52ad35853 Mon Sep 17 00:00:00 2001 From: uerceg Date: Mon, 5 Dec 2022 16:15:51 +0100 Subject: [PATCH 09/16] chore: fix indentation --- Adjust/ADJSKAdNetwork.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adjust/ADJSKAdNetwork.m b/Adjust/ADJSKAdNetwork.m index 2b3c964a3..0aaf655ed 100644 --- a/Adjust/ADJSKAdNetwork.m +++ b/Adjust/ADJSKAdNetwork.m @@ -238,7 +238,7 @@ - (NSString *)getSkAdNetworkCoarseConversionValue:(NSString *)adjustCoarseValue } - (Class)getSKAdNetworkClass { - return NSClassFromString(@"SKAdNetwork"); + return NSClassFromString(@"SKAdNetwork"); } @end From 3bd8f059e9de11444b716e54d74c6a1e3821cbe8 Mon Sep 17 00:00:00 2001 From: uerceg Date: Mon, 5 Dec 2022 16:18:57 +0100 Subject: [PATCH 10/16] feat: update version number to 4.33.2 --- Adjust.podspec | 4 ++-- Adjust/ADJUtil.m | 2 +- Adjust/Adjust.h | 2 +- AdjustBridge/AdjustBridgeRegister.m | 2 +- AdjustTests/AdjustUnitTests/ADJPackageFields.m | 2 +- VERSION | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Adjust.podspec b/Adjust.podspec index 7f404c27b..4ecb0b89b 100644 --- a/Adjust.podspec +++ b/Adjust.podspec @@ -1,11 +1,11 @@ Pod::Spec.new do |s| s.name = "Adjust" - s.version = "4.33.1" + s.version = "4.33.2" s.summary = "This is the iOS SDK of adjust. You can read more about it at http://adjust.com." s.homepage = "https://github.com/adjust/ios_sdk" s.license = { :type => 'MIT', :file => 'MIT-LICENSE' } s.author = { "Adjust GmbH" => "sdk@adjust.com" } - s.source = { :git => "https://github.com/adjust/ios_sdk.git", :tag => "v4.33.1" } + s.source = { :git => "https://github.com/adjust/ios_sdk.git", :tag => "v4.33.2" } s.ios.deployment_target = '9.0' s.tvos.deployment_target = '9.0' s.framework = 'SystemConfiguration' diff --git a/Adjust/ADJUtil.m b/Adjust/ADJUtil.m index 5f11dd573..99404ac3f 100644 --- a/Adjust/ADJUtil.m +++ b/Adjust/ADJUtil.m @@ -39,7 +39,7 @@ static NSRegularExpression *shortUniversalLinkRegex = nil; static NSRegularExpression *excludedDeeplinkRegex = nil; -static NSString * const kClientSdk = @"ios4.33.1"; +static NSString * const kClientSdk = @"ios4.33.2"; static NSString * const kDeeplinkParam = @"deep_link="; static NSString * const kSchemeDelimiter = @"://"; static NSString * const kDefaultScheme = @"AdjustUniversalScheme"; diff --git a/Adjust/Adjust.h b/Adjust/Adjust.h index 237815cca..7ee91f951 100644 --- a/Adjust/Adjust.h +++ b/Adjust/Adjust.h @@ -2,7 +2,7 @@ // Adjust.h // Adjust SDK // -// V4.33.1 +// V4.33.2 // Created by Christian Wellenbrock (@wellle) on 23rd July 2013. // Copyright (c) 2012-2021 Adjust GmbH. All rights reserved. // diff --git a/AdjustBridge/AdjustBridgeRegister.m b/AdjustBridge/AdjustBridgeRegister.m index 7015cfdf8..7929576a9 100644 --- a/AdjustBridge/AdjustBridgeRegister.m +++ b/AdjustBridge/AdjustBridgeRegister.m @@ -275,7 +275,7 @@ + (NSString *)adjust_js { if (this.sdkPrefix) { return this.sdkPrefix; } else { - return 'web-bridge4.33.1'; + return 'web-bridge4.33.2'; } }, setTestOptions: function(testOptions) { diff --git a/AdjustTests/AdjustUnitTests/ADJPackageFields.m b/AdjustTests/AdjustUnitTests/ADJPackageFields.m index 0fe2f58eb..f21e94077 100644 --- a/AdjustTests/AdjustUnitTests/ADJPackageFields.m +++ b/AdjustTests/AdjustUnitTests/ADJPackageFields.m @@ -16,7 +16,7 @@ - (id) init { // default values self.appToken = @"qwerty123456"; - self.clientSdk = @"ios4.33.1"; + self.clientSdk = @"ios4.33.2"; self.suffix = @""; self.environment = @"sandbox"; diff --git a/VERSION b/VERSION index deeeec6ce..d8b0870c7 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -4.33.1 +4.33.2 From 94c605b2bd3dffbe01966a75e3db5de03e2a50a8 Mon Sep 17 00:00:00 2001 From: uerceg Date: Mon, 5 Dec 2022 16:21:07 +0100 Subject: [PATCH 11/16] docs: update CHANGELOG --- CHANGELOG.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 524620c3b..b3e7b5573 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +### Version 4.33.2 (5th December 2022) +#### Fixed +- Added additional checks to make sure that non-existing selectors for given platform don't attempt to be executed (https://github.com/adjust/ios_sdk/issues/641). + +--- + ### Version 4.33.1 (28th November 2022) #### Added - Added support for setting a new China URL Strategy. You can choose this setting by calling `setUrlStrategy:` method of `ADJConfig` instance with `ADJUrlStrategyCn` parameter. @@ -5,7 +11,7 @@ --- -### Version 4.33.0 (November 19th 2021) +### Version 4.33.0 (November 19th 2022) #### Added - Added support for SKAdNetwork 4.0. From 9b5cc56c24b116968ea37818f02018fac6d51349 Mon Sep 17 00:00:00 2001 From: Genady Buchatsky Date: Mon, 5 Dec 2022 22:46:22 +0100 Subject: [PATCH 12/16] build: adds xcode 14 support --- scripts/build_definitions.sh | 56 ++++++++++++++++++++++++++-------- scripts/static_xcframeworks.sh | 5 ++- 2 files changed, 48 insertions(+), 13 deletions(-) diff --git a/scripts/build_definitions.sh b/scripts/build_definitions.sh index cc3921921..46f6f7139 100755 --- a/scripts/build_definitions.sh +++ b/scripts/build_definitions.sh @@ -184,11 +184,32 @@ Usage: $0 [options] XCF_FRM_ZIP_NAME__WEB_BRIDGE_DYNAMIC="AdjustSdk-WebBridge-Dynamic" XCF_FRM_ZIP_NAME__WEB_BRIDGE_STATIC="AdjustSdk-WebBridge-Static" + # Xcode version impacts the way we build frameworks + XCODE12PLUS=0 + XCODE14PLUS=0 + product_version=$(xcodebuild -version) + xcode_version=( ${product_version//./ } ) + xcode="${xcode_version[0]}" + major="${xcode_version[1]}" + minor="${xcode_version[2]}" + echo "${xcode}.${major}.${minor}" + if [[ $major > 11 ]]; then + XCODE12PLUS=1 + fi + if [[ $major > 13 ]]; then + XCODE14PLUS=1 + fi + + SDK_VERSION=$(head -n 1 VERSION) + echo "$SDK_VERSION" # previous builds artefacts cleanup rm -rf ${XCF_OUTPUT_FOLDER} mkdir ${XCF_OUTPUT_FOLDER} + # previous xcode build folder cleanup + xcodebuild clean + function build_archive() { # Prameters: # 1 - scheme name @@ -220,12 +241,14 @@ Usage: $0 [options] # 1 - Archive name # 2 - Archive location folder #echo "XCFramework: Generating BCSymbolMap paths command from $1 ..." - - BCSYMBOLMAP_PATHS=("$(pwd -P)"/$2/$1.xcarchive/BCSymbolMaps/*) - BCSYMBOLMAP_COMMANDS="" - for path in "${BCSYMBOLMAP_PATHS[@]}"; do - BCSYMBOLMAP_COMMANDS="$BCSYMBOLMAP_COMMANDS -debug-symbols $path " - done + BCSYMBOLMAP_PATHS=" " + if [[ $XCODE14PLUS == 0 ]]; then + BCSYMBOLMAP_PATHS=("$(pwd -P)"/$2/$1.xcarchive/BCSymbolMaps/*) + BCSYMBOLMAP_COMMANDS="" + for path in "${BCSYMBOLMAP_PATHS[@]}"; do + BCSYMBOLMAP_COMMANDS="$BCSYMBOLMAP_COMMANDS -debug-symbols $path " + done + fi echo $BCSYMBOLMAP_COMMANDS } @@ -286,12 +309,21 @@ Usage: $0 [options] xcodebuild clean if [[ $os == "ios" ]]; then - - xcodebuild -configuration Release \ - -target "$target_scheme" \ - -sdk iphonesimulator \ - -arch x86_64 -arch i386 \ - build + + if [[ $XCODE14PLUS > 0 ]]; then + # Xcode14 dropped 32-bit support, so we have to drop 'i386' arc. + xcodebuild -configuration Release \ + -target "$target_scheme" \ + -sdk iphonesimulator \ + -arch x86_64 \ + build + else + xcodebuild -configuration Release \ + -target "$target_scheme" \ + -sdk iphonesimulator \ + -arch x86_64 -arch i386 \ + build + fi xcodebuild -configuration Release \ -target "$target_scheme" \ diff --git a/scripts/static_xcframeworks.sh b/scripts/static_xcframeworks.sh index c0746c4fe..c95284102 100755 --- a/scripts/static_xcframeworks.sh +++ b/scripts/static_xcframeworks.sh @@ -23,6 +23,7 @@ then echo -e "${CYAN}[ADJUST][BUILD]:${GREEN} XCFramework: Buiding Static XCFramework for ${TRAGET_PLATFORM_DESCRIPTION} ...${NC}" echo -e "${CYAN}[ADJUST][BUILD]:${GREEN} = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =${NC}" + xcodebuild clean if [[ $BUILD_TARGET_IOS -eq 1 ]] then @@ -109,6 +110,8 @@ then echo -e "${CYAN}[ADJUST][BUILD]:${GREEN} XCFramework: Buiding Static XCFramework for iOS (iMessage)...${NC}" echo -e "${CYAN}[ADJUST][BUILD]:${GREEN} = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =${NC}" + xcodebuild clean + xcodebuild -configuration Release \ -target ${SCHEMA_NAME__ADJUST_IM_STATIC} \ -sdk iphonesimulator \ @@ -137,7 +140,7 @@ fi # = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = if [[ $BUILD_TARGET_WEB_BRIDGE -eq 1 ]] -then +then echo -e "${CYAN}[ADJUST][BUILD]:${GREEN} = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =${NC}" echo -e "${CYAN}[ADJUST][BUILD]:${GREEN} XCFramework: Buiding Static XCFramework for iOS (WebBridge)...${NC}" echo -e "${CYAN}[ADJUST][BUILD]:${GREEN} = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =${NC}" From 224eb96dc29cb0b0d7514298ed8b14d96a439d74 Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 6 Dec 2022 11:37:06 +0100 Subject: [PATCH 13/16] docs: update CHANGELOG --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b3e7b5573..750948608 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -### Version 4.33.2 (5th December 2022) +### Version 4.33.2 (6th December 2022) #### Fixed - Added additional checks to make sure that non-existing selectors for given platform don't attempt to be executed (https://github.com/adjust/ios_sdk/issues/641). From bf1611af40d867e31a11a8d4fb169629e7a6f8ca Mon Sep 17 00:00:00 2001 From: Aditi3 Date: Thu, 27 Jan 2022 14:49:11 +0530 Subject: [PATCH 14/16] Update `compatibilityVersion` to `Xcode 10.0` From de4d15b43d11cf79896e3914785b2ab6a73f8c17 Mon Sep 17 00:00:00 2001 From: Aditi3 Date: Thu, 27 Jan 2022 14:49:11 +0530 Subject: [PATCH 15/16] Update `compatibilityVersion` to `Xcode 10.0` From 526f51a804a44437dad89d5b1deebc0b1f118a34 Mon Sep 17 00:00:00 2001 From: Aditi3 Date: Thu, 27 Jan 2022 14:49:11 +0530 Subject: [PATCH 16/16] Update `compatibilityVersion` to `Xcode 10.0`